2011-08-10 20 views
4

で配列を横断するとき、私はC言語で、この小さな機能を書きました。もし私が ポインタを使用して配列を横断すれば、その大丈夫、どんなアイディアですか?セグメンテーションフォールトC

P.S. 渡される配列が関数の外で定義されているため、リンクの問題はありません。

+1

ROWSとCOLSは何に設定されていますか?あなたの配列はどれくらい大きいですか? –

+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

関数宣言では、第1次元のサイズとしてROWS、第2次元のサイズとしてCOLSが得られます。関数本体では、最初の次元でCOLS回、2番目にROWS回ループしています。配列の宣言が関数宣言またはコードの "暗黙の宣言"と一致するかどうかによって、問題が発生する可能性があります。関数宣言の使用では

+2

配列宣言はどのようにこれに影響を与えますか? –

+0

明瞭にするために編集されました。 –

6

iCOLSjまでループを使用する場合、char arr[ROWS][COLS]を持っているし、あなたのループ内であなたがarr[i][j]としてarrを使用するにはROWSまでループに使用されています。

COLSROWSは、どちらの状況でも入れ替えられます。

+0

私はあなたに+1を与えましたが、少し上手くフレーズすることができました。コード例で説明してください。これは受け入れられた答えでなければなりません。 –

+0

私は私の答えを若干再定式化しました。これが奇妙なことを除いて(私の答えはスワップされていたので)、なぜこれがセグメンテーション違反につながるのか考え出すことはできません。この問題を修正した営業担当者のコメントは、さらに独特です。 – Veger

+0

彼のインデックスが間違っていると、彼は無効なインデックスにアクセスするでしょう。 –

関連する問題