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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

837閲覧

ダブルポインタを使用した二次元配列の作成

kaneko_

総合スコア9

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/13 16:16

前提・実現したいこと

ダブルポインタを使用してM×N行列の二次元配列を作成、表示したい

発生している問題・エラーメッセージ

ビルドエラーは発生していないが、

c

1H[i] = malloc(sizeof(int) * N);

のところに、
C6011:NULLポインタ”H"を逆参照しています
というエラーが出る。また、ビルドをすると、printfの行で例外が出てスローする

例外がなぜかprintfのほうに出るのですが、getchをかませてデバックしたりしたところ、
動的メモリ確保の部分で間違えているのかなと思います。しかし、何が間違っているのかがわかりません。ご教授よろしくお願いします。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#define N 8 4#define M 4 5 6int initialize_matrix(double **H) 7{ 8 for (int i1 = 0; i1 < M; i1++){ 9 for (int i2 = 0; i2 < N; i2++){ 10 H[i1][i2] = 0; 11 } 12 } 13 return 0; 14} 15 16int print_matrix(double** H){ 17 for (int i1 = 0; i1 < M; i1++){ 18 for (int i2 = 0; i2 < N; i2++){ 19 printf('%d',H[i1][i2]); 20 } 21 printf("\n"); 22 } 23 return 0; 24} 25 26int main() 27{ 28 int** H;//[M][N] 29 30 //動的メモリ確保 31 H = malloc(sizeof(int*) * M); 32 for (int i = 0; i < M; i++) { 33 H[i] = malloc(sizeof(int) * N); 34 } 35 36 initialize_matrix(H); 37 print_matrix(H); 38 39 40 //メモリの開放 41 for (int i = 0; i < M; i++){ 42 free(H[i]); 43 } 44 free(H); 45 46 return 0; 47}

補足情報(FW/ツールのバージョンなど)

visual studio 2018

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

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

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

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

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

dodox86

2021/02/13 17:53

> C6011:NULLポインタ”H"を逆参照しています については、マイクロソフトのVisual Studioのリファレンスにもあるように、`NULL`ポインタを使ってしまう可能性があることを警告しています。 [C6011 - Microsoft Docs] https://docs.microsoft.com/ja-jp/cpp/code-quality/c6011?view=msvc-160 具体的には、一番最初に `H = malloc(sizeof(int*) * M)`と`malloc`している部分で、`H`が`NULL`であるかどうかを検証していない為に警告が報告されているかたちです。ですので、この部分を以下のように改修するとC6011警告は消えます。 //動的メモリ確保 H = malloc(sizeof(int*) * M); if (H == NULL) { return 1; } for (int i = 0; i < M; i++) { H[i] = malloc(sizeof(int) * N); }
guest

回答1

0

ベストアンサー

関数内のポインタの型がdoubleになっていましたので、int宣言に合わせました。
printfのクォーテーションがシングルになっていたので、ダブルクォーテーションに修正しました。

#include <stdio.h> #include <stdlib.h> #define N 8 #define M 4 int initialize_matrix(int **H) { for (int i1 = 0; i1 < M; i1++){ for (int i2 = 0; i2 < N; i2++){ H[i1][i2] = 0; } } return 0; } int print_matrix(int** H){ for (int i1 = 0; i1 < M; i1++){ for (int i2 = 0; i2 < N; i2++){ printf("%d", H[i1][i2]); } printf("\n"); } return 0; } int main() { int** H;//[M][N] //動的メモリ確保 H = malloc(sizeof(int*) * M); for (int i = 0; i < M; i++) { H[i] = malloc(sizeof(int) * N); } initialize_matrix(H); print_matrix(H); //メモリの開放 for (int i = 0; i < M; i++){ free(H[i]); } free(H); return 0; }

投稿2021/02/13 17:32

phoepsilonix

総合スコア233

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

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

kaneko_

2021/02/13 19:30

ありがとうございました。 関数の宣言の型が間違っていたから確保したメモリ量が足りなかったようです。 シングルクオーテーションの件も気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問