で配列を横断するとき、私は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
関数宣言では、第1次元のサイズとしてROWS
、第2次元のサイズとしてCOLS
が得られます。関数本体では、最初の次元でCOLS
回、2番目にROWS
回ループしています。配列の宣言が関数宣言またはコードの "暗黙の宣言"と一致するかどうかによって、問題が発生する可能性があります。関数宣言の使用では
配列宣言はどのようにこれに影響を与えますか? –
明瞭にするために編集されました。 –
i
がCOLS
とj
までループを使用する場合、char arr[ROWS][COLS]
を持っているし、あなたのループ内であなたがarr[i][j]
としてarr
を使用するにはROWS
までループに使用されています。
COLS
とROWS
は、どちらの状況でも入れ替えられます。
私はあなたに+1を与えましたが、少し上手くフレーズすることができました。コード例で説明してください。これは受け入れられた答えでなければなりません。 –
私は私の答えを若干再定式化しました。これが奇妙なことを除いて(私の答えはスワップされていたので)、なぜこれがセグメンテーション違反につながるのか考え出すことはできません。この問題を修正した営業担当者のコメントは、さらに独特です。 – Veger
彼のインデックスが間違っていると、彼は無効なインデックスにアクセスするでしょう。 –
ROWSとCOLSは何に設定されていますか?あなたの配列はどれくらい大きいですか? –
彼らは実際に問題だった – yotamoo
Marceloのヘッダに定義されています! – yotamoo