2010-01-04 44 views
1

編寫相當簡單的程序時遇到了問題。我有一個靜態分配的向量作爲一個全局變量,在一個函數中,我試圖改變這些元素的值,那就是程序停止並且表示分段錯誤。該代碼是這樣的:更新數組值時出現分段錯誤

int a[10] = {0,0,0,0,0,0,0,0,0,0}; 

... 

int bla(int i){ 
    ... 

    a[i] = a[i] + i%3; //segmentation fault at this line 

    ... 
} 

在主函數中我有一個「爲」我在其中取值爲0〜9

+3

明顯的答案是您的索引我無效。你能張貼更多的代碼來顯示我如何計算? – Naveen 2010-01-04 14:13:18

+1

那麼解決方案是什麼? – Constantin 2010-01-04 16:17:25

回答

7

你在傳遞什麼樣的價值觀我的?如果它> 9,那麼你會得到一個分段錯誤。

你應該對其進行調試,並通過當它傳遞到功能檢查i的值步驟。此外,你的函數應該檢查任何價值在我進去時,以確保它在範圍內,作爲一般的好習慣,

+0

我是從0到9 – Renee 2010-01-04 14:13:33

+0

也許'bla'被稱爲一些未初始化的'i'? – Heinzi 2010-01-04 14:14:53

+0

你怎麼知道它是0到9?你有沒有經歷過,看到我崩潰時的價值? – 2010-01-04 14:15:37

1

你可能會調用與i >= 10(或< 0)BLA作爲參數。

2

檢查看看我的價值。如果他們出於任何原因結束了10或更高,那是導致seg故障的原因。

一個很好的方法來檢查將是隻要致電:

printf("i: %d\n", i); 

在嗒嗒的頂部。

然後轉到blah被調用的位置,並計算出我是如何結束大於或等於10.我的猜測是你在for循環中調用它,並且for的循環語句有錯誤循環(中間一個,此時技術術語越逃離我)。如果你調用它像這樣:

for(int i = 0; i < 11; i++) 
    blah(i); 

或者這樣:

for(int i = 0; i <= 10; i++) 
    blah(i); 

那些是錯的,段錯誤的原因。

+0

printf是導致所有段錯誤的原因。 ;) – 2010-01-04 17:20:47

1

你可能想嘗試一個調試器,在Linux上嘗試gdb。在Windows上,嘗試使用Visual Studio或任何其他內置調試的IDE。並跟蹤錯誤。

0

您可能正在修改只讀向量。

1

你爲什麼不寫?(只是一個提示)

int a[10]={0}; //Similar to what you have written 

但是主要的問題是,因爲變量「i'.What是價值‘I’傳遞給你的函數?如果大於9則意味着您試圖訪問數組出界它調用的未定義行爲

0

我希望你確信你只訪問現有的元素,那就是,我是範圍0..9?現在想不到任何其他的東西。