0

爲什麼此程序每次都在不同的值上對段進行段錯誤?數組綁定的違規:在不同索引下的段錯誤

#include <stdio.h> 
int main() { 

    int a[16], i = 0; 
    while(1) { 
    a[i] = i; 
    printf("%d\n", a[i]); 
    i++; 
    } 
} 
+0

這是什麼編程語言?它是C嗎?請用正在使用的語言標記您的問題。要更新您的問題,請點擊帖子下的**「[edit]」**鏈接。謝謝。 – Pang

回答

0

我認爲這將與C分配內存的方式有關。當您使用行

int a[16] 

什麼你基本上說的是「我分配足夠的內存空間來保存16個整數,開始在給定的點(這個點x)」。

然後,當你說

while(1) { 
    a[i] = i; 
    printf("%d\n", a[i]); 
    i++; 
} 

你說,永遠,設置ith指數ai並打印。這項工作起始於x,然後一次移動一個索引。對於前十六個整數,這很好,因爲你已經清除了空間。

但是,當你經過那個時候,你還沒有清理空間,所以你不知道那裏有什麼以及可以覆蓋或打印什麼。這可能會好一段時間,但是你會發現你無法覆蓋內存中的內容(它不是免費的)。此時你會得到你的segfault

由於每次運行程序時都會在不同的地方分配空間,因此需要進行不同次數的迭代才能達到內存使用的位置,因此您將在不同的索引處使用segfault

+0

解釋:爲什麼代碼在i = 16時不是segfault,是因爲程序沒有分配16 * sizeof(int)字節的內存,而是由操作系統分配給堆棧的整個頁面。硬件檢測到頁面邊界違規並引發OS要處理的中斷,然後OS將分段信號發送給進程。但是,如果我們多次運行程序,這仍然不能解釋我的不同值,因爲給予程序的頁面大小將始終相同。 – Abhijit

+0

你能鏈接你從哪裏來的? – JCollerton

+0

整個程序被分配一個堆以便進行動態內存分配,但是該函數不會動態分配內存。該函數調用將使用堆棧中的內存來存儲局部變量。它將從一個固定大小的堆棧中分配一個塊(因爲動態內存分配是在堆上完成的),它將根據您給它的數組大小確定該大小。然後,當你超過這個尺寸時,你會得到上面的問題。 – JCollerton