遍歷數組時,我用C寫了這個小功能行列數均在頭文件分段故障在C
定義。當我把它叫做我不斷收到分段錯誤。如果我使用 指針來遍歷數組,那麼爲什麼?
p.s. 傳遞的數組是在函數外部定義的,所以沒有鏈接問題。
遍歷數組時,我用C寫了這個小功能行列數均在頭文件分段故障在C
定義。當我把它叫做我不斷收到分段錯誤。如果我使用 指針來遍歷數組,那麼爲什麼?
p.s. 傳遞的數組是在函數外部定義的,所以沒有鏈接問題。
您在循環中交換了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,這是數組的最後一個字節。
你是完全正確的! – Veger
在你的函數聲明中,你有ROWS
作爲第一維的大小,而COLS
作爲第二維的大小;但在你的函數體中,你在第一維上循環了COLS
次,在第二維上循環了ROWS
次。取決於數組聲明是否匹配函數聲明或代碼中的「隱含聲明」,這可能是一個問題。
數組聲明如何影響這個? – 2011-08-10 15:27:20
爲了清晰起見進行了編輯。 –
在函數聲明中使用具有char arr[ROWS][COLS]
,並在循環使用arr
作爲arr[i][j]
,其中i
用於循環直到COLS
和j
用於循環,直到ROWS
。
您的COLS
和ROWS
在兩種情況之間交換。
我給你+1了,但看起來你可以用這個更好一點,或許用一個代碼示例來說明。這應該是被接受的答案。 – 2011-08-10 15:30:25
我稍微重新表達了我的答案,希望現在可以更好地表達。除了這很奇怪(因此我的答案是他們被交換),我不能想出爲什麼這會導致分段錯誤的想法。 OP評論說這已經解決了這個問題的事實更加奇怪...... – Veger
因爲如果他的索引是錯誤的,他將訪問一個無效的索引。 – 2011-08-10 15:42:59
什麼是ROWS和COLS設置?你的陣列有多大? – 2011-08-10 15:23:44
它們被定義在標題中 – yotamoo
Marcelo實際上是這個問題! – yotamoo