重新分配内存时出现分段错误
Segmentation fault on reallocating of memory
我需要制作一个面包店管理程序,我已经完成了结构和三个指针数组,这些数组必须包含这些结构对象的指针。但是我无法添加新面包店的功能,因为它需要动态内存分配。我试过这样做,但它会在重新分配时抛出 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 = ...
}
我需要制作一个面包店管理程序,我已经完成了结构和三个指针数组,这些数组必须包含这些结构对象的指针。但是我无法添加新面包店的功能,因为它需要动态内存分配。我试过这样做,但它会在重新分配时抛出 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 = ...
}