0

多次元配列 (8 行、3 列) にメモリを割り当てようとしています。

割り当てのコードは次のとおりです(エラーは明らかです)

char **ptr = (char **) malloc( sizeof(char) * 8);

for (i = 0; i < 3; i++)
    ptr[i] = (char *) malloc( sizeof(char) * 3);

これを参照すると、クラッシュが発生します。

ptr[3][0];

xxxx.exe の 0x0135144d で未処理の例外: 0xC0000005: アクセス違反書き込み場所 0xabababab。

この種のテーマについて、推奨される参考文献や読み物はありますか?

ありがとう。

4

6 に答える 6

8

最初malloc()は間違っています。そのはず:

malloc(sizeof(char*) * 8)

Achar*は4バイト(または8バイト... PSを参照)charですが、1バイトです。あなたが書くとき、コンパイラはあなたが+ptr[3]のベースアドレスにアクセスしたいと仮定します。したがって、割り当てていないメモリにアクセスします。ptr3*sizeof(char*)

PS:

より正確にchar*は、32 ビット システムでは 4 バイト、64 ビット システムでは 8 バイトです。

于 2010-06-02T16:00:06.330 に答える
6

私はメモリ割り当てに関する本を手に負えませんが、Cの入門チュートリアルで説明する必要があります。バグに関しては、forループは割り当てた8行ではなく、最初の3行のみを初期化します。そのはず:

for (i = 0; i < 8; i++)
于 2010-06-02T15:58:58.027 に答える
4
char **ptr = (char **) malloc( sizeof(char *) * 8);

以前は、8 文字のスペースを割り当てていました。char への 8 つのポインター用のスペースが必要です。

Michael は、割り当てたことのない文字列から最初の char を書き込んでいるという別のエラーを指摘しました。

次のような定数を使用すると役立つ場合があります。

const int STRING_COUNT = 8;
const int STRING_LEN = 2;

char **ptr = (char **) malloc( sizeof(char *) * STRING_COUNT);
于 2010-06-02T15:59:12.223 に答える
3

コードにはいくつかのエラー/矛盾がありますが、最初の主要なものはsizeof最初の割り当てで間違っています。いくつかのグッドプラクティスガイドラインに従えば、あなたが犯したエラーは簡単に回避できたでしょう。

(1)ステートメントで型名を使用することはできるだけ避けてください。タイプ名は、ステートメントではなく宣言に属します。

(2)メモリ割り当て関数の結果をキャストしないでください。

最初の割り当ては次のようになっているはずです

char **ptr = malloc( 8 * sizeof *ptr );

これを一般的なパターンとして覚えておいてください。mallocリクエストは通常​​、次のようになります。

pointer = malloc( count * sizeof *pointer );

注:上記のステートメントでは、タイプ名は言及されていません。

もちろん、2D配列の最初のサイズについても決める必要があります。8を割り当てようとすると、3だけを初期化します。なぜですか。

于 2010-06-02T16:08:21.780 に答える
3

ptrは s ではなく 8 つのポインターの配列であるcharため、最初の行は次のようになります。

char **ptr = (char **) malloc( sizeof(char*) * 8)

8 つのポインターがあるため、ループは 0 から 7 に移動する必要があります。

for (i = 0; i < 8; i++)

最初の行のエラーが発生しにくいバージョンを使用することも検討できます。

char **ptr = (char **) malloc( sizeof(*ptr) * 8)

そして最後のもの:

ptr[i] = (char *) malloc( sizeof(*ptr[i]) * 3);

ルールは次のとおりsizeofです。逆参照された左辺値を常に取得します。lvalue がptrの場合、 が必要sizeof(*ptr)です。ptr[i]になりsizeof(*ptr[i])ます。

于 2010-06-02T16:05:09.760 に答える
1

2 つの問題があります。

まず、他の人が指摘したように、最初の malloc は

malloc(sizeof(char *) * 8)

次に、 8 要素配列の最初の3 つの要素を初期化していますが、 4 番目ptr[3][0]の要素を参照しています。したがって、クラッシュ。

于 2010-06-02T16:04:12.977 に答える