test1.c:
int main(int argc, char *argv[])
{
int n,m,q;
scanf(" %d%d%d",&n,&m,&q);
struct test_t test;
FILE* fp = fopen("test.txt","rw");
while (fscanf(fp,"%d%s%d%d%d%d%d%d%d%*d",&test.line,test.data,&test.number[0],&test.number[1],&test.number[2],&test.number[3],&test.number[4],&test.number[5],&test.number[6])!=EOF) {
//do something....
}
return 0;
}
test2.c:
struct test_t {
int line;
char* data;
int number[7];
};
test_t的定义:
141 2015-12-05 19 16 35 06 34 46 09 00
124 2015-12-08 49 25 10 09 40 48 32 00
143 2015-12-10 09 29 24 47 32 34 42 00
我的test.txt:
FILE* fp = fopen("test.txt","rw");
当我使用test1.c时,我得到分段错误。但是当我使用test2.c时,它运行良好。只改变{{1}}的行。造成这种差异的原因是什么。< / p>
答案 0 :(得分:2)
您正在调用UB,因为您从未为char* data;
分配内存。修正:
malloc
循环之前 while
足够的内存:
test.data = malloc(32);
if(!test.data)
{
fprintf(stderr, "malloc failed...Bailing out!\n");
exit(-1);
}
使用后,
free(test.data);
使用预定义大小的数组而不是指向char
的指针:
char data[32];
此外,作为@AshishAhuja said,还要检查fopen
的返回值。
答案 1 :(得分:2)
好吧,当您从其他地方运行程序时,该位置很可能不存在该文件。因此,请检查fopen
是否返回NULL
。这样做:
FILE* fp = fopen("test.txt","rw");
if (fp == NULL) {
printf ("Error, file does not exist\n");
exit (1);
}
打开不存在的文件不是问题,因为fopen
只会返回NULL
。尝试读取或写入会导致分段错误以及核心转储。
此外,您永远不会为char *data
分配内存,这可能会导致问题。要正确分配和免费,请参阅@CoolGuy's answer。