質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

507閲覧

Visual Studio 2022「C6011 NULL ポインター 'nextField' を逆参照しています。」がわからない

0901_77

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/05/24 15:04

実現したいこと

二次元配列をmalloc関数を使って、メモリ確保したい

発生している問題・分からないこと

ゲームづくりの本を読みながら、ライフゲームを作成していたのですが、本の中では、malloc関数を使わずに、二次元配列を宣言していたのですが、私は、malloc関数を使って、二次元配列を確保したかったので、コードを変更したところ、以下のようなエラーが出てきました。何が原因かわからないのです。

エラーメッセージ

error

1重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 2警告 C6011 NULL ポインター 'nextField' を逆参照しています。 ライフゲーム 3警告 C6011 NULL ポインター 'nextField[i]' を逆参照しています。ライフゲーム 4警告 C6011 NULL ポインター 'nextField[y]' を逆参照しています。ライフゲーム 5警告 C6385 'nextField' から無効なデータを読み取っています。 ライフゲーム 6 7 8

該当のソースコード

//[4-3]ステップ分のシミュレーションを実行する関数を宣言する void StepSimulation() { //[4-3-1]次の世代のフィールドを宣言する //bool nextField[FIELD_HEIGHT][FIELD_WIDTH] = {};この行は本に書かれていたコードです。 //次の世代のフィールドのメモリを確保する。 bool** nextField = (bool**)malloc(FIELD_HEIGHT * sizeof(bool*)); if (nextField != NULL) { for (int i = 0; i < FIELD_HEIGHT; i++) { nextField[i] = (bool*)malloc(FIELD_WIDTH * sizeof(bool)); } } else { fprintf(stderr, "メモリが確保できません。\n"); getchar(); }        //配列の初期化 for (int i = 0; i < FIELD_HEIGHT; i++) { for (int j = 0; j < FIELD_WIDTH; j++) { nextField[i][j] = false; } } //[4-3-2]すべての行を反復する for (int y = 0; y < FIELD_HEIGHT; y++) { //[4-3-3]すべての列を反復する for (int x = 0; x < FIELD_WIDTH; x ++) { //[4-3-4]対象のセルと隣接する、生きているセルの数を宣言する int livingCellcount = GetLivingCellsCount(x, y); //[4-3-5]隣接する生きたセルの数で分岐する if (livingCellcount <= 1)//[4-3-5]1個なら { //[4-3-6]対象のセルを死滅させる nextField[y][x] = false; } else if (livingCellcount == 2)//[4-3-7]2個なら { //[4-3-8]現状維持 nextField[y][x] = field[y][x]; } else if (livingCellcount == 3)//[4-3-9]3個なら { //[4-3-10]対象のセルを誕生/生存させる nextField[y][x] = true; } else if(livingCellcount >= 4)//[4-3-11]4つ以上なら { //[4-3-12]対象のセルを死滅させる nextField[y][x] = false; } } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ネットで検索をしましたが、解決できませんでした。

補足

Visual Studio 2022

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

malloc はメモリの確保に失敗する可能性があります。

失敗している場合には返されるポインタは意味のある領域を指していませんが、このコードだと確保に失敗したときに無効なポインタを通じてメモリにアクセスする可能性があることが警告されています。

投稿2024/05/24 17:10

SaitoAtsushi

総合スコア5714

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

setoppu

2024/05/25 08:12

malloc()でメモリ確保に失敗した場合はNULLを返却かと。 malloc()で確保したメモリの中身は不定値ですが。 C6011は指定の通り、可能性のハナシですね。 もしそうなった場合、 >fprintf(stderr, "メモリが確保できません。\n"); >getchar(); で表示だけして継続するので、 //配列の初期化 のところでNULLポインタアクセスになる。と…。 本来は処理を継続せずに抜けるなりするところでしょう。 現実的にはアホなサイズでない限りはmalloc()は失敗しないでしょうけど。
guest

0

VisualStudio使ってるなら、エラーなりワーニングなり出ているところで実行を止め、そこの変数のナカミを確認してみましょう。
そうすればなにが起きて、そいつが出ているのかわかるかと思います。

#それでもわからないってことなら、もっと勉強しよう、ってことで。

投稿2024/05/24 22:45

y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SaitoAtsushi

2024/05/25 01:52

これは NULL の「可能性」に対しての警告なので実際に動作させてみてもわからないと思います。 (多くの場合に malloc は失敗しないので。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問