gpt4 book ai didi

c - 导致 SIGTRAP 的自由函数

转载 作者:行者123 更新时间:2023-11-30 15:48:11 25 4
gpt4 key购买 nike

我有一个关于释放为结构数组分配的内存的新手问题。这是代码:

typedef struct {
char code[6];
char name[31];
char cname[31];
int anno;

} cliente;

cliente *readcostumers(char*filename,int * dim) {
int i;
cliente *d;
cliente temp;
FILE*fp;
fp=fopen(filename,"r");
*dim=0;
//count the number of lines
while(fscanf(fp,"%s %s %s %d", temp.code, temp.name, temp.cname,&(temp.anno))==4)
(*dim)++;
rewind(fp);
//allocate "dim" struct
int ss = sizeof(cliente);
d = (cliente*)malloc(ss * (*dim));
cliente *currCli = d;
//assign lines to struct
for(i=0; i<*dim; i++) {
fscanf(fp,"%s %s %s %d",currCli->code, currCli->name, currCli->cname, &(currCli->anno));
currCli = currCli + ss;
}
fclose(fp);
return d;
}

这段代码基本上读取一个具有任意行数、使用特定模式格式化的文本文件,并将内容分配给 strcut cliente 数组。

这似乎工作正常,除非我释放之前分配的内存:

int main () {
int x,i;


cliente *f = readcostumers("c:/temp/clienti.txt",&x);
int len = sizeof(cliente);
for(i=0; i<x; i++) {
printf("\n%s %s %s %d",(f + len*i)->code, (f + len*i)->name,
(f + len*i)->cname, (f + len*i)->anno);
}
free(f);
}

最后一个语句 free(f) 会导致 SIGTRAP 异常,尽管打印的值是从文件中正确读取的。

文件内容是这样的:

A3789 Paolo Rossi 2001
X478D Marcantonio Bianchi 2004

哪里错了?

最佳答案

当您在 readcostumers 中增加 currCli 时,您应该使用 1 并且在 main 中您不应该乘以索引为len。这些都是由语言来处理的。这两个错误相互补偿,但同时您正在访问分配的内存之外,并且很可能会覆盖堆分配算法的内部管理。最终导致free崩溃。

查看 valgrind 工具,因为它可以完美地发现此类错误。

关于c - 导致 SIGTRAP 的自由函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16926626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com