我正在编写一个输出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指针。
答案 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 here。 scanf的某些文档也可能有所帮助。
答案 3 :(得分:2)
scanf
是一个C函数,由于C没有像C ++那样的“引用”,因此将scanf
传递给scanf
的唯一方法是结果。如果scanf
没有指针告诉它存储结果的位置,那么它就无法将结果返回给调用者。
因此scanf
被编写为接受(并期望)指针作为其参数,如果你给它int's
而不是指针,它将只是尝试使用那些int's
作为指针 - 这可能会导致段错误。
答案 4 :(得分:1)
'scanf()'存储值,因此它需要一个存储它们的地方。这是通过提供存储值的地址来完成的。'&amp;'用于在scanf语句中引用变量的地址。