在结构中创建灵活的数组大小
create flexible array size in struct
你好,我有这些结构代码
我需要使我的 head[]
数组大小灵活
例如,如果我的头数组大小为 9,我如何将它扩展为 10?!
struct Graph
{
// An array of pointers to Node to represent an adjacency list
struct Node *head[N];
};
// Data structure to store adjacency list nodes of the graph
struct Node
{
int dest, weight;
struct Node *next;
};
如何创建具有灵活头数组大小的结构图?
具有灵活数组成员的 struct
通常有一个成员跟踪数组的大小,所以我假设它看起来像这样:
struct Graph {
size_t nodes;
struct Node *head[];
};
要为这样的 struct
分配内存,您需要调用 malloc
并对 sizeof(Graph)
求和(其中灵活成员的范围被计为 0
) 和 sizeof(struct Node*[the_number_of_node_pointers_you_want])
.
示例:
struct Graph *Graph_create(size_t nodes) {
struct Graph *g = malloc(sizeof *g + sizeof(struct Node*[nodes]));
if(g) g->nodes = nodes;
return g;
}
如果以后想扩展灵活数组,可以类似地使用realloc
:
// this returns true or false depending on if expansion succeeded
bool Graph_expand(struct Graph **g, size_t nodes) {
if(*g && (*g)->nodes < nodes) {
struct Graph *ng = realloc(*g, sizeof *ng + sizeof(struct Node*[nodes]));
if(ng) {
*g = ng;
(*g)->nodes = nodes;
return true;
}
}
return false;
}
关于扩展数组的注意事项:realloc
如果不能就地扩展分配,可能会移动内存。如果发生这种情况并且您有任何指针 到 您的旧 Graph
对象,它们将被那个 realloc
.
无效
你好,我有这些结构代码
我需要使我的 head[]
数组大小灵活
例如,如果我的头数组大小为 9,我如何将它扩展为 10?!
struct Graph
{
// An array of pointers to Node to represent an adjacency list
struct Node *head[N];
};
// Data structure to store adjacency list nodes of the graph
struct Node
{
int dest, weight;
struct Node *next;
};
如何创建具有灵活头数组大小的结构图?
具有灵活数组成员的 struct
通常有一个成员跟踪数组的大小,所以我假设它看起来像这样:
struct Graph {
size_t nodes;
struct Node *head[];
};
要为这样的 struct
分配内存,您需要调用 malloc
并对 sizeof(Graph)
求和(其中灵活成员的范围被计为 0
) 和 sizeof(struct Node*[the_number_of_node_pointers_you_want])
.
示例:
struct Graph *Graph_create(size_t nodes) {
struct Graph *g = malloc(sizeof *g + sizeof(struct Node*[nodes]));
if(g) g->nodes = nodes;
return g;
}
如果以后想扩展灵活数组,可以类似地使用realloc
:
// this returns true or false depending on if expansion succeeded
bool Graph_expand(struct Graph **g, size_t nodes) {
if(*g && (*g)->nodes < nodes) {
struct Graph *ng = realloc(*g, sizeof *ng + sizeof(struct Node*[nodes]));
if(ng) {
*g = ng;
(*g)->nodes = nodes;
return true;
}
}
return false;
}
关于扩展数组的注意事项:realloc
如果不能就地扩展分配,可能会移动内存。如果发生这种情况并且您有任何指针 到 您的旧 Graph
对象,它们将被那个 realloc
.