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