在结构中创建灵活的数组大小

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;
}

Demo

关于扩展数组的注意事项:realloc 如果不能就地扩展分配,可能会移动内存。如果发生这种情况并且您有任何指针 您的旧 Graph 对象,它们将被那个 realloc.

无效