Scanf为非指针参数产生分段错误

时间:2013-11-19 03:47:41

标签: c segmentation-fault

我正在编写一个输出html文件的程序,实际上我正在学习CGI编程。该程序在执行循环时运行时停止('for'和'while'两者)。

返回的错误是Segmentation fault (core dumped)

代码(仅导致问题的程序段)是:

void main()
{
int track=0;
int question_no;
printf("\nHow many questions?\t");
scanf("%d",question_no);
while(track<=question_no)
    {
        printf("\nAshish");
        track++;
    }
}

其实我得到答案:我应该使用'&amp;'将值输入question_no时。

但我的下一个问题是为什么?我应该使用&吗?因为我将question_no定义为int而不是int指针。

5 个答案:

答案 0 :(得分:4)

更改

scanf("%d",question_no);

scanf("%d",&question_no);

看看会发生什么......

scanf获取指向内存位置的指针,该位置放置int值。因此它尝试使用question_no作为地址并导致seg错误。那时question_no从未被初始化,所以它可能是任何东西,程序试图写入该位置。

&会返回question_no的地址。

答案 1 :(得分:3)

  

我为什么要使用&amp;?因为我将question_no定义为int而不是int指针

那就是原因。 scanf需要一个指针才能改变该值。它需要一个指针,你传递一个int,它转换为一个具有一些垃圾值(地址)的指针。

答案 2 :(得分:2)

基本上,分段问题是当您的程序尝试访问尚未分配的内存时。您特别关注的是此行,它会调用undefined behavior,因为您在此处使用question_no未初始化:

scanf("%d",question_no);

并且您正在将question_no视为指针,这就是您想要的:

scanf("%d",&question_no);

启用警告可能会帮助您发现此错误,gcc会提供以下警告:

  

警告:格式'%d'需要类型为'int *'的参数,但参数2的类型为'int'[-Wformat]

对于gcc我经常使用-Wall -Wextra -pedantic,您可以找到完整的description herescanf的某些文档也可能有所帮助。

答案 3 :(得分:2)

scanf是一个C函数,由于C没有像C ++那样的“引用”,因此将scanf传递给scanf的唯一方法是结果。如果scanf没有指针告诉它存储结果的位置,那么它就无法将结果返回给调用者。

因此scanf被编写为接受(并期望)指针作为其参数,如果你给它int's而不是指针,它将只是尝试使用那些int's作为指针 - 这可能会导致段错误。

答案 4 :(得分:1)

'scanf()'存储值,因此它需要一个存储它们的地方。这是通过提供存储值的地址来完成的。'&amp;'用于在scanf语句中引用变量的地址。