2013-06-18 33 views
-1

用c語言編寫的以下代碼有什麼問題? 我遇到了分段錯誤。它是什麼?做數組和輸入與scanf齊頭並進?

int a[2]; 
for(i=0;i<2;i++) 
{ 
    scanf("%d",a[i]); 
    printf("%d",a[i]); 
} 

爲什麼不能運行?留下聲明。 scanf是否有延遲問題?

+1

請不要使用'scanf'和'printf'等庫函數,而不知道它的基本用法。在這裏閱讀手冊頁http://linux.die.net/man/3/scanf。 – VoidPointer

+0

@VoidPointer這是非常好的評論,但我也問你別的東西。是的,scanf需要指針,但是當它不存在時會發生什麼,這是我的問題。此外,我遇到了分段錯誤。在這種情況下是什麼?] – Mani

+0

清楚地提及這個問題。格式說明符後給出的'scanf'參數被認爲是**指針**。行爲是** undefined **當在第一個參數之後發送除整數'a [i]'的值之類的指針之外的參數時。 – VoidPointer

回答

2

此:

scanf("%d",a[i]); 

是錯誤的。該%d格式說明需要指針以其中值應存放轉換之後,也就是說,它應該是:

scanf("%d", &a[i]); 

這否則你傳遞的a[i]價值scanf()需要,給它沒辦法更改的值。通過傳遞值的地址,scanf()可以簡單地寫入所提供的內存地址來更改存儲在那裏的值。使用printf()時,您不希望自己的值發生變化,因此將它們直接傳遞給printf()就沒有問題。

另外,轉換(像許多其他形式的I/O)可能會失敗,所以你應該依靠轉換已經成功之前檢查返回值:

if(scanf("%d", &a[i]) == 1) 
    printf("%d\n", a[i]); 

你或許應該閱讀the manual page for scanf()一對夫婦更倍。 :)

+0

但是它在printf中不是必需的。這是爲什麼?請回答我什麼是分段錯誤? – Mani

+0

@max我加了一些關於'printf()'的文字。您可以在其他地方[閱讀分段錯誤](http://en.wikipedia.org/wiki/Segmentation_fault)。基本上這意味着你的操作系統檢測到你的程序做了一些不允許的事情(比如試圖通過解釋整數'a [i]'作爲指針來寫入它不擁有的內存)。 – unwind

1

將[i]的地址傳遞給scanf而不是a [i]的值。

scanf("%d",&a[i]);