我想使用 realloc 擴展包含結構“文章”的陣列,所以我告訴 realloc 獲取舊陣列并擴展它,然后將我的新文章添加到新陣列中,但這不起作用,我不能發現問題。這是錯誤訊息 >corrupted size vs. prev_size Abandon (core dumped)
typedef struct
{
char ref[6];
float pu;
int qt;
char desi[31];
}Article;
void global(void)
{
FILE * fe;
Article *tart,l;
int nbart;
fe=fopen("a.txt","a ");
tart=chargeFarticle(fe,&nbart);
Showtart(tart,nbart);
printf("Ref: ");
scanf("%s",l.ref);
printf("pu: ");
scanf("%f",&l.pu);
printf("qt: ");
scanf("%d%*c",&l.qt);
printf("Desi: ");
fgets(l.desi,31,stdin);
l.desi[strlen(l.desi) -1]='\0';
tart=AddArt(l,tart,&nbart);
Showtart(tart,nbart);
fclose(fe);
}
Article readArt(FILE * fe)
{
Article a;
fscanf(fe,"%s%f%d",a.ref,&a.pu,&a.qt);
fgets(a.desi,31,fe);
a.desi[strlen(a.desi) - 1]='\0';
return a;
}
Article * chargeFarticle(FILE*fe,int *nbart)
{
Article *tart;
int i;
fscanf(fe,"%d",nbart);
tart=(Article *)malloc(*nbart*sizeof(Article));
if(tart==NULL)
{
printf("Pb Malloc\n");
exit(1);
}
for(i=0;i<*nbart;i )
tart[i]=readArt(fe);
return tart;
}
Article * AddArt(Article l,Article *tart,int *nbart)
{
int i;
Article *aux;
aux=(Article *)realloc(tart,*nbart*sizeof(Article));
free(tart);
tart=aux;
tart[*nbart]=l;
*nbart =1;
return tart;
}
uj5u.com熱心網友回復:
至少有這些問題:
壞的 free()
當realloc()作品,也不需要free(old pointer)。事實上,realloc()可能回傳相同的指標。
aux=(Article *)realloc(tart,*nbart*sizeof(Article));
// free(tart);
最好測驗分配成功并洗掉不必要的強制轉換。
if (*nbart < 0) {
// Handle error
}
aux = realloc(tart,sizeof *tart * *nbart);
if (aus == NULL && *nbart > 0) {
// Handle error
}
超出范圍
tart[*nbart]=l;訪問tart[*nbart]超出其范圍。
不安全的歸零
l.desi[strlen(l.desi) -1]='\0';當然不是尾隨'\n'。 '\n'可能不存在,fgets()可能失敗,惡意輸入strlen(l.desi)可能為 0。
更好作為 l.desi[strcspn(l.desi, "\n")] = '\0'
其他事宜?
uj5u.com熱心網友回復:
a.desi[strlen(a.desi) - 1]='\0';
char *removeNewLine(char *c)
{
char *wrk = c;
if(c)
{
while(*wrk) wrk ;
if(wrk - c)
{
if(wrk[-1] == '\n') wrk[-1] = 0;
}
}
return c;
}
許多其他錯誤 - 由@chux 列出。
我會以其他方式實施:
typedef struct
{
char ref[6];
float pu;
int qt;
char desi[31];
}Article;
typedef struct
{
size_t nArticles;
Article articles[];
}Articles_db;
Articles_db *readArt(Articles_db *art, FILE *fe)
{
size_t newsize = art ? art -> nArticles 1 : 1;
art = realloc(art, sizeof(*art) sizeof(art -> articles[0]) * newsize);
if(art)
{
Article *a = art -> articles newsize - 1;
fscanf(fe,"%s%f%d", a -> ref, &a -> pu, &a -> qt);
fgets(a -> desi,31,fe);
/* check the results of the I/O functions */
art -> nArticles = newsize;
}
return art;
}
Articles_db *chargeFarticle(FILE*fe,int *nbart)
{
Articles_db *tart = NULL, *tmp;
int i;
fscanf(fe,"%d",nbart);
/* check the result of fscanf */
for(i=0;i<*nbart;i )
{
tmp = readArt(tart, fe);
if(!tmp)
{
printf("Memory allocation error\n");
break;
}
tart = tmp;
}
return tart;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373370.html
標籤:C
上一篇:如何正確訪問這個重新分配的陣列?
