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。它会 运行 完美。
如果要增加循环大小,则必须增加结构的大小。
我在对自引用结构调用 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。它会 运行 完美。
如果要增加循环大小,则必须增加结构的大小。