运行程序时出现错误:
*** glibc detected *** ./prog: double free or corruption (!prev): 0x09155170 ***
问题显然是通过malloc给结构提供内存,但是我不知道它有什么问题。 这是我的程序代码(在C中):
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char kood[4];
int kogus;
char nimetus[80];
double hind;
int P;
int K;
int A;
}ese;
void sort(int m, ese* d);
void search_kood(int m, ese* d);
void search_nimetus(int m, ese* d);
void search_kuupaev(int m, ese* d);
int menu();
int main (void)
{
FILE *list;
list = fopen("elektroonikapood.txt", "r");
int menu_valik,m,i;
m=0;
if (list==NULL)
{
printf("Empty or corrupted file!");
getchar();
return 0;
}
ese *esemed = (ese*) malloc(sizeof(ese));
while(!feof(list))
{
fscanf(list, "%s", esemed[m].kood);
fscanf(list, "%d", &esemed[m].kogus);
fscanf(list, "%s", esemed[m].nimetus);
fscanf(list, "%lg", &esemed[m].hind);
fscanf(list, "%d", &esemed[m].P);
fscanf(list, "%d", &esemed[m].K);
fscanf(list, "%d", &esemed[m].A);
m++;
}
while(1)
{ menu_valik = menu();
if(menu_valik == 1)
sort(m, esemed);
else if (menu_valik == 2)
search_kood(m, esemed);
else if (menu_valik == 3)
search_kuupaev(m, esemed);
else if (menu_valik == 4)
search_nimetus(m, esemed);
else if (menu_valik == 0)
{
free(esemed);
fclose(list);
exit(1);
}
else
break;
}
return 0;
}
还有一些额外的功能,但我认为它们没有问题。
答案 0 :(得分:4)
在此声明中:
ese *esemed = (ese*) malloc(sizeof(ese));
您只为一个结构分配空间。之后直接读入多个结构,从而覆盖内存。
答案 1 :(得分:1)
首先...... don't cast malloc in C。它可以隐藏错误。
第二......你的malloc在while( !feof( list ) )
循环之外但它只分配了一个ese结构的实例,但是你循环意味着你正在加载多个实例......意味着你要覆盖记忆......此时所有的赌注都会被取消。
ese *esemed = NULL;
ese *lastItem = NULL;
while(!feof(list))
{
ese* newItem = malloc( sizeof( ese ) );
if( !esemed ) esemed = newItem;
if( lastItem ) lastItem->next = newItem;
lastItem = newItem;
fscanf(list, "%s", newItem->kood);
fscanf(list, "%d", &newItem->kogus);
fscanf(list, "%s", newItem->nimetus);
fscanf(list, "%lg", &newItem->hind);
fscanf(list, "%d", &newItem->P);
fscanf(list, "%d", &newItem->K);
fscanf(list, "%d", &newItem->A);
}