当我为内部带有联合的嵌套结构分配和释放内存时出了什么问题
What's wrong when I allocate and free memory for a nested struct with union inside
我使用 Linux 并使用其 C 编译器工具和 IDE Geany 进行编程。
我尝试学习如何使用内部带有联合的结构,并为它们动态分配内存。我有一个带有嵌套结构的动态分配数组;
struct SellItem {
char title[50];
char description[500];
int price;
int nr_of_img;
char ** image_files;//array of strings
};
struct ParagraphItem{
char * text;
};
union ContentItem{//one of the following only
struct SellItem s_item;
struct ParagraphItem p_item;
};
struct Content{
int type;//1=sellitem 2=paragraph
union ContentItem c_item;
};
主线:
struct Content * content; // The array to be
int content_count=0; // To show array size
我已经填写了两个测试项目,从 "image files";
开始
char ** img_files;
img_files = malloc(sizeof(char*) * 2);//two strings
img_files[0] = malloc(25);
img_files[1] = malloc(25);
strcpy(img_files[0], "img1.jpg");
strcpy(img_files[1], "img2.jpg");
struct SellItem item1 = {.title = "Pants", .description="Brown", .price=200, .image_files = img_files, .nr_of_img = 2};
struct SellItem item2 = {.title = "Shirt", .description="White", .price=100, .nr_of_img = 0};
content = malloc(sizeof(struct Content) * 2);
content[0].type=1;
content[0].c_item.s_item = item1;
content[1].type=1;
content[1].c_item.s_item = item2;
content_count = 2;
这似乎有效。
当我尝试添加新项目时,我使用了函数:
void increase(struct Content** content, int *nr_of_content){
//I send in content_count as 2:nd param
*content = realloc(*content, (*nr_of_content+1) * sizeof(struct Content));
(*nr_of_content)++;
}
我设置为
content[content_count].type = 1;
strcpy(content[content_count].c_item.s_item.title, "Test");
strcpy(content[content_count].c_item.s_item.description, "Beskrivning");
content[content_count].c_item.s_item.price = 100;
content[content_count].c_item.s_item.nr_of_img = 0;
可以使用另一个具有 "top-declaration"
的打印功能访问并在屏幕上打印
void print_1_content(struct Content);
关闭程序时我想释放内存;
if(content_count > 0)
{
printf("Ska fria minnne\n");
for(int i=0;i<content_count;i++)
{
printf("I content nummer %d\n", i);
if(content[i].type==1)
{
printf("%i är typ 1\n", i);
if(content[i].c_item.s_item.nr_of_img>0)
{
printf("Har bilder\n");
for(int j=0;j<content[i].c_item.s_item.nr_of_img;j++)
{
printf("Ska fria bild nr %d\n", j);
free(content[i].c_item.s_item.image_files[j]);
printf("Friade en img minne\n");
}
}
}
else if(content[i].type==2)
{
printf("%i är typ 2\n", i);
free(content[i].c_item.p_item.text);
}
}
free(content);
content_count=0;
}
我收到错误消息
*** Error in `./short_v': double free or corruption (!prev): 0x0000560b6727cf90 ***
已中止(核心已转储)
到达第三项(单元格)时出现。
这是两个错误之一,另一个是当我想在屏幕上打印所有内容时出现的。
你对content_count
的使用是错误的:
strcpy(content[content_count].....
但 content_count
索引 超出 数组。因此未定义的行为。
使用:
strcpy(content[content_count-1]....
我使用 Linux 并使用其 C 编译器工具和 IDE Geany 进行编程。
我尝试学习如何使用内部带有联合的结构,并为它们动态分配内存。我有一个带有嵌套结构的动态分配数组;
struct SellItem {
char title[50];
char description[500];
int price;
int nr_of_img;
char ** image_files;//array of strings
};
struct ParagraphItem{
char * text;
};
union ContentItem{//one of the following only
struct SellItem s_item;
struct ParagraphItem p_item;
};
struct Content{
int type;//1=sellitem 2=paragraph
union ContentItem c_item;
};
主线:
struct Content * content; // The array to be
int content_count=0; // To show array size
我已经填写了两个测试项目,从 "image files";
开始char ** img_files;
img_files = malloc(sizeof(char*) * 2);//two strings
img_files[0] = malloc(25);
img_files[1] = malloc(25);
strcpy(img_files[0], "img1.jpg");
strcpy(img_files[1], "img2.jpg");
struct SellItem item1 = {.title = "Pants", .description="Brown", .price=200, .image_files = img_files, .nr_of_img = 2};
struct SellItem item2 = {.title = "Shirt", .description="White", .price=100, .nr_of_img = 0};
content = malloc(sizeof(struct Content) * 2);
content[0].type=1;
content[0].c_item.s_item = item1;
content[1].type=1;
content[1].c_item.s_item = item2;
content_count = 2;
这似乎有效。
当我尝试添加新项目时,我使用了函数:
void increase(struct Content** content, int *nr_of_content){
//I send in content_count as 2:nd param
*content = realloc(*content, (*nr_of_content+1) * sizeof(struct Content));
(*nr_of_content)++;
}
我设置为
content[content_count].type = 1;
strcpy(content[content_count].c_item.s_item.title, "Test");
strcpy(content[content_count].c_item.s_item.description, "Beskrivning");
content[content_count].c_item.s_item.price = 100;
content[content_count].c_item.s_item.nr_of_img = 0;
可以使用另一个具有 "top-declaration"
的打印功能访问并在屏幕上打印void print_1_content(struct Content);
关闭程序时我想释放内存;
if(content_count > 0)
{
printf("Ska fria minnne\n");
for(int i=0;i<content_count;i++)
{
printf("I content nummer %d\n", i);
if(content[i].type==1)
{
printf("%i är typ 1\n", i);
if(content[i].c_item.s_item.nr_of_img>0)
{
printf("Har bilder\n");
for(int j=0;j<content[i].c_item.s_item.nr_of_img;j++)
{
printf("Ska fria bild nr %d\n", j);
free(content[i].c_item.s_item.image_files[j]);
printf("Friade en img minne\n");
}
}
}
else if(content[i].type==2)
{
printf("%i är typ 2\n", i);
free(content[i].c_item.p_item.text);
}
}
free(content);
content_count=0;
}
我收到错误消息
*** Error in `./short_v': double free or corruption (!prev): 0x0000560b6727cf90 ***
已中止(核心已转储)
到达第三项(单元格)时出现。
这是两个错误之一,另一个是当我想在屏幕上打印所有内容时出现的。
你对content_count
的使用是错误的:
strcpy(content[content_count].....
但 content_count
索引 超出 数组。因此未定义的行为。
使用:
strcpy(content[content_count-1]....