2011-08-10 45 views
4

遍歷數組時,我用C寫了這個小功能行列數均在頭文件分段故障在C

定義。當我把它叫做我不斷收到分段錯誤。如果我使用 指針來遍歷數組,那麼爲什麼?

p.s. 傳遞的數組是在函數外部定義的,所以沒有鏈接問題。

+1

什麼是ROWS和COLS設置?你的陣列有多大? – 2011-08-10 15:23:44

+0

它們被定義在標題中 – yotamoo

+0

Marcelo實際上是這個問題! – yotamoo

回答

5

您在循環中交換了ROWS和COLS。

表達式arr[i][j]相當於*(&arr[0][0] + COLS*i + j),並且由於換換,最後一次訪問變爲*(&arr[0][0] + COLS*(COLS - 1) + (ROWS - 1))

如果例如COLS是100並且ROWS是50,那麼訪問的最後一個元素從開始將是100 * 99 + 49 = 9949個字節,但是該數組只有5000個字節。以正確的方式翻轉事物,最後一次訪問變爲100 * 49 + 99 = 4999,這是數組的最後一個字節。

+0

你是完全正確的! – Veger

10

在你的函數聲明中,你有ROWS作爲第一維的大小,而COLS作爲第二維的大小;但在你的函數體中,你在第一維上循環了COLS次,在第二維上循環了ROWS次。取決於數組聲明是否匹配函數聲明或代碼中的「隱含聲明」,這可能是一個問題。

+2

數組聲明如何影響這個? – 2011-08-10 15:27:20

+0

爲了清晰起見進行了編輯。 –

6

在函數聲明中使用具有char arr[ROWS][COLS],並在循環使用arr作爲arr[i][j],其中i用於循環直到COLSj用於循環,直到ROWS

您的COLSROWS在兩種情況之間交換。

+0

我給你+1了,但看起來你可以用這個更好一點,或許用一個代碼示例來說明。這應該是被接受的答案。 – 2011-08-10 15:30:25

+0

我稍微重新表達了我的答案,希望現在可以更好地表達。除了這很奇怪(因此我的答案是他們被交換),我不能想出爲什麼這會導致分段錯誤的想法。 OP評論說這已經解決了這個問題的事實更加奇怪...... – Veger

+0

因爲如果他的索引是錯誤的,他將訪問一個無效的索引。 – 2011-08-10 15:42:59