C - 自引用结构和重新分配

C - Self-referencing structure and realloc

我在对自引用结构调用 realloc 时遇到问题。当我 运行 这个程序时,我得到错误 *** Error in ...: realloc(): invalid next size: 0x0000000000602160 ***。我想问题与最后一行有关,因为程序 运行s 如果我评论它没有任何问题。

这是最小的(不是)工作代码:

#include <string.h>
#include <stdlib.h>

typedef struct structure {
    int connections;
    struct structure *links;
} structure;

int main(int argc, char *argv[]) {
    int struct_count;
    int i, from, to, offset;
    structure *structs;

    struct_count = 2;

    structs = malloc(sizeof(structure) * struct_count);
    memset(structs, 0, sizeof(structure) * struct_count);
    for(i = 0; i < struct_count; i++) {
        structs[i].links = malloc(1);
        structs[i].connections = 0;
    }

    for(i = 0; i < 100; i++) {
        from = 0;
        to = 1;

        offset = structs[from].connections++;
        structs[from].links = realloc(structs[from].links, sizeof(int) * (offset + 1));
        structs[from].links[offset] = structs[to]; // This is the problematic line - why?
    }
}

我的问题是:该代码有什么问题?

问题是第一次分配的时候不够用。要分配给定类型的 n 个元素,您可以使用

structs[i].links = malloc(n * sizeof(*structs[i].links));

realloc() 一样,您还需要确保 realloc() 不 return NULL,假设在分配 space 之后对于具有上面一行的 n 结构,您想要调整大小以存储 n + 1 个实例,然后

struct structure *links;
links = realloc(structs[i].links, (n + 1) * sizeof(*links));
if (links == NULL)
{
   /* Depending on the way your program is designed */
   probably_free_links(&structs[i].links);
   /*                  ^ make it `NULL' inside */
   allocation_failure_do_something_about_it_but_do_not_continue();
}
structs[i].links = links;

您最初可以制作 structs[i].links = NULL;realloc() 将在第一次时表现得像 malloc()

编写您的程序时,就好像所有错误都是可能的,并对它们采取措施,不要让您的程序调用未定义的行为,让您和您的程序用户感到困惑。

如果您增加结构的蓝图并减小循环的大小,它将运行完美..

**例如:-**不操纵 运行 你的程序只是将循环条件从 100 减少到 2。它会 运行 完美。

如果要增加循环大小,则必须增加结构的大小。