2017-07-19 46 views
2

所以我面临一个奇怪的问题。声明后续未使用的int时,出现分段错误。当我删除声明时,代码完美运行。怎么会这样?涉及未使用变量的分段错误

FILE* ptr = fopen("prueba.txt", "r"); 
int x; 
char* a; 
int y = 0; //this cause the seg fault. 
do{ 
    while (fscanf(ptr, "%i", &x)!=-1){ 
     fscanf(ptr, "%s", a); 
      printf("%i %s ",x, a); 
    } 
    fseek(ptr, 0, SEEK_SET); 
}while(1); 


fclose(ptr); 
} 

但是即使我使用它,说有y++;printf后,我仍然得到分割故障。

+0

fscanf(ptr,“%s”,a);这看起来像是问题。 a不是malloced – CIsForCookies

+2

'fscanf(ptr,“%s”,a);'覆盖随机存储器。通过添加一个变量,你碰巧改变了它所踩踏的随机存储器。 – Art

+0

@艺术,太短的答案得到autochanged评论。如果您可以在答案部分中找到答案,它将有助于永久性地在“未答复”部分中显示此问题。 – CDahn

回答

5

printf后我仍然seg。故障。

那么,段错误可能是由原因A引起的,只有在一段时间后才会被捕获。

此行:fscanf(ptr, "%s", a)正在读取字符串到a而不先分配内存 - > UB。

仅在printf处调用UB。修复aa=malloc(SOME_SIZE)char a[SOME_SIZE],这应该消失

1

需要初始化你的字符指针,char *a,通过使用callocmalloc功能。或者,使用自动存储持续时间的阵列,如char a[20];

在代码中,你逝去的未初始化的指针到fscanf()有效也就是说fscanf()是要覆盖到的内存的未定义区域。

+1

*使用堆栈分配*如果您将措辞更改为“使用具有自动存储持续时间的阵列”会更好。 –