这些代码行怎么会导致完全相同的程序有时会崩溃但是其他工作正常呢?

时间:2015-03-15 19:07:36

标签: c arrays pointers struct

我有一个带有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;
}

2 个答案:

答案 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