我有一个带有int的结构和一个指向结构的指针数组:
//Define a struct
struct city
{
//Declaration of struct members
int city_num;
struct city **connected;
};
以及这些结构中的'n'数组:
struct city* cities;
cities = malloc(n*sizeof(struct city));
我想在为其分配空间后,将指向一个结构的指针分配给另一个结构的'connected'成员。
cities[j].connected = realloc(cities[j].connected, (1*sizeof(struct city*));
cities[i].connected = realloc(cities[i].connected, (1*sizeof(struct city*));
cities[j].connected[0]=&list[i];
cities[i].connected[0]=&list[j];
但是程序SOMETIMES在最后两行崩溃了。昨天它像现在一样崩溃,然后深夜它刚刚开始工作,没有我改变任何东西(我只是评论其余的代码)和今天工作整个早上它刚刚决定再次开始崩溃。 (我正在使用Code :: Blocks 13.12)
我已经整理了一个非常简化的程序版本,向大家展示问题所在。
#include <stdio.h>
#include <stdlib.h>
//Define a struct
struct city
{
//Declaration of struct members
int city_num;
struct city **connected;
};
int main()
{
int n = 2;
struct city* cities;
cities = malloc(n*sizeof(struct city));
cities[0].city_num = 1;
cities[1].city_num = 2;
cities[0].connected = realloc(cities[0].connected, (1*sizeof(struct city*)));
cities[1].connected = realloc(cities[1].connected, (1*sizeof(struct city*)));
//CRASHES AT THESE TWO LINES <-------------------------------------------------
cities[0].connected[0]=&cities[1];
cities[1].connected[0]=&cities[0];
//I have ommitted the memory freeing from this code as the problem is caused above this point
return 0;
}
答案 0 :(得分:2)
realloc()
的第一个参数必须是malloc()
返回的地址,或之前对realloc()
的回复。
以下一行:
cities[0].connected = realloc(cities[0].connected, (1*sizeof(struct city*)));
传递cities[0].connected
,它不包含其中一个函数返回的地址。事实上,它还没有被初始化!因此,这是对realloc()
的无效调用。
这被视为未定义的行为,并且可能会导致代码崩溃。但是,由于我们不知道您传递的是哪个地址,并且每次都可能是不同的地址,因此有时可能不会崩溃。但这总是错的。
注意:如果您将NULL
作为第一个参数传递,则realloc()
将像malloc()
一样工作。但是在这里你传递的是一个整数值,可能是任何东西。
你需要做这样的事情:
cities[0].connected = malloc(1*sizeof(struct city*));
请注意,释放此内存的代码变得有点复杂,因为您需要释放每个地址。
答案 1 :(得分:1)
realloc()
在需要的内容比malloc()
或calloc()
之前分配的内容时重新分配内存。
但是当传递的第一个参数是NULL
时,它也有效。
所以要回答你的问题你的代码有时工作的原因,有时候不是,是因为虽然传递的指针尚未被之前的分配初始化,但发生有时是NULL
。