我需要编写一个用于面包店管理的程序,我已经完成了结构和三个指针数组,这些数组必须包含这些结构对象的指针。但是我无法使函数添加新的面包店,因为它需要动态内存分配。我试图这样做,但是它在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;
}
最佳答案
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 = ...
}