重新分配内存时出现分段错误

时间:2019-12-04 14:47:16

标签: c arrays segmentation-fault structure realloc

我需要编写一个用于面包店管理的程序,我已经完成了结构和三个指针数组,这些数组必须包含这些结构对象的指针。但是我无法使函数添加新的面包店,因为它需要动态内存分配。我尝试这样做,但是它在重新分配时抛出 Segmentation Fault 。如果有任何建议如何为这些数组适当地重新分配内存以添加元素,我将不胜感激。我也正在学习关于代码中其他错误的注释。

typedef struct BakeryType {
    char *name;
} BakeType;

typedef struct Bakerys {
    char *name;
    BakeType *type;
    char *photo;
    float weight;
    int portions;
    float price;
    char *description;
} Bakery;

Bakery *bakeryList[0];
BakeType *bakeTypeList[0];

void addBakery() {
    Bakery new;
    *bakeryList = realloc(*bakeryList, (sizeof(bakeryList)/ sizeof(Bakery))+ 1);//Segmentation Fault
    bakeryList[sizeof(bakeryList)/sizeof(Bakery)]=&new;
}


1 个答案:

答案 0 :(得分:1)

bakeryList是指向Bakery的指针的零元素数组。它有零指针的空间。

然后,您将此数组的第一个元素(与*bakeryList相同的bakeryList[0]设置为从realloc返回的值。因此,您正在覆盖某些内容,它可能会从那里走下坡路。

我认为您希望bakeryList只是指向Bakery的指针。这就是在C中动态分配的数组的工作方式:您定义了指向第一个元素的指针,并使用指针数学(例如bakeryList[5]*(bakeryList + 5))来访问其他元素。

另一个问题是您使用sizeof(bakeryList)sizeof是由编译器评估的运算符。它在运行时不会更改。 sizeof(bakeryList) / sizeof(Bakery)的值为零,因为您将bakeryList定义为零元素数组。您需要另一个变量来跟踪运行时数组中实际有多少个元素。

类似的事情会起作用:

int bakeryCount = 0;
Bakery *bakeryList = NULL;

void addBakery() {
    // Add one to the array.
    bakeryCount++;
    bakeryList = realloc(bakeryList, bakeryCount * sizeof (Bakery));
    // Create a pointer to the new element at the end of the array.
    Bakery *newBakery = bakeryList + bakeryCount - 1;
    // Set all the fields. Note that they will probably contain
    // garbage so you should set them all.
    newBakery->name = ...
}