[英]Scanf produces segmentation fault for non-pointer argument
我正在用c編寫一個輸出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++;
}
}
實際上,我得到了答案:將值輸入到question_no
時,應該使用“&”。
但是我的下一個問題是為什么? 我應該使用&
嗎? 因為我將question_no
定義為int
而不是int指針。
更改
scanf("%d",question_no);
至
scanf("%d",&question_no);
看看會發生什么...
scanf
獲取一個指向要放置int值的內存位置的指針。 因此,它嘗試使用question_no
作為地址,這導致了seg錯誤。 question_no
尚未初始化,因此可能是任何東西,程序嘗試寫入該位置。
&
返回question_no
的地址。
為什么要使用&? 因為我將question_no定義為int,而不是int指針
那就是為什么。 scanf需要一個指針才能使值變異。 它需要一個指針,將其傳遞給它的int會轉換為具有一定垃圾值(地址)的指針。
基本上,分段錯誤是指您的程序嘗試訪問尚未分配的內存時。 您的特殊問題是此行,由於您使用的是這里未初始化的question_no
,因此它會調用未定義的行為 :
scanf("%d",question_no);
並且您正在將question_no
當作一個指針對待,這就是您想要的:
scanf("%d",&question_no);
啟用警告可能會幫助您發現此錯誤, gcc
提供了以下警告:
警告:格式'%d'期望參數類型為'int *',但是參數2的類型類型為'int'[-Wformat]
對於gcc
我經常使用-Wall -Wextra -pedantic
,您可以在此處找到完整的說明 。 一些scanf的文檔也可能會有所幫助。
scanf
是C函數,並且由於C不像C ++那樣具有“引用”,因此將指針傳遞到scanf
是scanf
能夠存儲其結果的唯一方法。 如果scanf
沒有指針告訴它將結果存儲在哪里,則它不可能將其結果返回給調用方。
因此, scanf
被編寫為接受(並期望)指針作為其參數,並且,如果將其賦予int's
而不是指針,它將僅嘗試使用那些int's
作為指針-這很可能會導致段錯誤。
'scanf()'存儲值,因此需要一個存儲值的地方。這是通過提供存儲值的地址來實現的。'&'用於在scanf語句中引用變量的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.