C - 自引用结构和realloc

时间:2015-10-05 19:13:48

标签: c pointers structure realloc

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

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

#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?
    }
}

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

2 个答案:

答案 0 :(得分:3)

问题是你第一次分配它,这还不够。要分配给定类型的n元素,您可以使用

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

同样明智的realloc()您还需要确保realloc()不返回NULL,假设在为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()

编写您的程序就好像所有错误都是可能的,并对它们做一些事情不要只是让您的程序调用未定义的行为并使其对您和您的程序用户产生误解。

答案 1 :(得分:-1)

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

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

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