2013-07-05 80 views
2

我真的很困惑數組和指針。
請告訴我以下兩個代碼有什麼區別?
c中的數組和指針之間的區別?

int main() 
{ 
    int i,*p; 
    for(i=0;i<5;i++) 
    { 
     p[i]=i; 
     printf("%d",p[i]); 
    } 
return 0; 
} 

int main() 
{ 
    int i,p[5]; 
    for(i=0;i<5;i++) 
    { 
     p[i]=i; 
     printf("%d",p[i]); 
    } 
return 0; 
} 
+1

@devnull什麼是它得到了公平的事。?這只是可取的 - 如果你沒有看到它的發生,這可能是因爲其他觀衆沒有很好的答案書籤,或更難找到......只是用你自己的近距離投票開始它...... –

+0

我當我看到標題時很確定它是重複的,然後在描述中猶豫不決,但是*必須是*類似的帖子,它們具有相同的根本原因。但我意識到,新手用戶可能很難將他們與他的問題聯繫起來。因此,我不會爲此而投下一票。 – phoeagon

+0

嘿PLZ告訴我關於標誌和投票... –

回答

7

第一個結果爲undefined behaviour。 對於沒有UB,您需要使用malloccalloc分配內存。 分配內存將把數據存儲在堆中。完成任務後,還需要free分配的內存。

第二個不會導致UB。它將數組數據存儲在堆棧中而不是堆中。 一旦範圍結束,內存將自動從堆棧中釋放。

+0

非常感謝@Vijay其實我是新來的c你能告訴我我在哪裏可以找到關於數據如何存儲在堆或棧中的更多信息? –

4

在第一個p指向垃圾的位置(​​未分配),我敢肯定,你使用它的方式將產生一個分段錯誤。你應該先分配內存,在使用它之前,如:

p = malloc(5 * sizeof(int)) 

二是在堆棧中分配,並把它在聲明範圍內的壽命

+0

不一定是分段錯誤,它的未定義行爲,他的代碼可能會運行,或者可能與核心轉儲崩潰。它的未定義閱讀Vijay的答案。 –

+0

是的,您是對的 –

+0

感謝@ Pavel.lazar和Grijesh Chauhan您能告訴我關於分段故障的更多信息嗎? –

相關問題