簡體   English   中英

Scanf為非指針參數產生分段錯誤

[英]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 ++那樣具有“引用”,因此將指針傳遞到scanfscanf能夠存儲其結果的唯一方法。 如果scanf沒有指針告訴它將結果存儲在哪里,則它不可能將其結果返回給調用方。

因此, scanf被編寫為接受(並期望)指針作為其參數,並且,如果將其賦予int's而不是指針,它將僅嘗試使用那些int's作為指針-這很可能會導致段錯誤。

'scanf()'存儲值,因此需要一個存儲值的地方。這是通過提供存儲值的地址來實現的。'&'用於在scanf語句中引用變量的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM