在gcc
上使用linux
编译时没有问题,但是当我运行此代码时,它总是报告
段错误(核心已转储)
#include <stdio.h>
void main ()
{
FILE *fp;
char ch,str[10240],arr[10800][3];
int i,j,k;
if((fp=fopen("structure_backup.dat","r"))==NULL)
{
printf("\nCannot open file!!!");
getchar();
exit(1);
}
ch = ' ';
i = 0,j=0,k=0;
while(ch != EOF)
{
ch = fgetc(fp);
while(ch !='\n')
{
while(ch != '\t')
{
str[k]=ch;
k++;
}
arr[i][j]=str;
k=0;
j++;
}
arr[i][j]=str;
k=0;
j=0;
i++;
}
fclose(fp);
}
答案 0 :(得分:2)
#include <stdio.h>
void main ()
{
FILE *fp;
char ch,str[10240],arr[10800][3];
int i,j,k;
if((fp=fopen("structure_backup.dat","r"))==NULL)
{
printf("\nCannot open file!!!");
getchar();
exit(1);
}
ch = ' ';
i = 0,j=0,k=0;
while(ch != EOF)
{
ch = fgetc(fp);
while(ch !='\n')
{
while(ch != '\t') // <=== HERE is where you go off the rails, never escape this whileloop
{
str[k]=ch;//<==== NOW YOU STORE ch in str[k], never escaping the while loop
k++;//<=== k goes to MAX_SIZE here, eventually causing the write above to be out of bounds. str[9999999999] is an invalid index for example.
}
arr[i][j]=str;
k=0;
j++;
}
arr[i][j]=str;
k=0;
j=0;
i++;
}
fclose(fp);
}
我已经复制了您的OP来源,并在发生段错误的地方添加了注释。您或者需要在嵌套的while循环中重新获取ch,或者使嵌套的while循环成为if语句。无论哪种方式都存在段错误:)
答案 1 :(得分:0)
while(ch != '\t')
{
str[k]=ch;
k++;
}
如果ch不是'\ t',则这是无限循环,因为ch的值不会改变并且数组str将会溢出。
例如,如果ch为'a',则str [k]的谷值为'a',k增加,然后在'a'!='\ t'时再次执行此循环,然后str [k] ='a',k增加,...,直到数组str溢出。