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

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

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

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

Q&A

解決済

2回答

5577閲覧

NULLポインタの間接参照エラー

ua_y

総合スコア5

C

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

0グッド

1クリップ

投稿2021/07/30 07:22

編集2021/07/30 07:34

「NULLポインタの間接参照です」のエラー内容が分からない

C言語のプログラムを作成しています。
できあがったコードを静的解析ツールにかけたのですが、「NULLポインタの間接参照です」が表示され何で怒られているのか分かりません。
NULLで初期化しているので、アドレスを代入するのは問題ないと思うのですが、どこかまずい箇所がありますか?

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

ポインタはNULLチェックされたにもかかわらず、その後間接参照されます。

該当のソースコード

c

1//代入元の配列を定義 2const LIST_st OutList[] = 3{ 4... 5}; 6 7main() 8{ 9... 10 //ポインタを定義(前後のコードの関係上ダブルポインタで設計しています。。) 11 const LIST_st **InList = NULL; 12 //LISTの数だけメモリを確保 13 InList = (const LIST_st**)malloc(sizeof(LIST_st*) * (LIST_NUM)); 14 if(InList == NULL) 15 { 16 abort(); 17 } 18 19 //OutListのアドレスを順にInListに代入していく 20 for(i = 0; i < LIST_NUM; i++) 21 { 22 //ここでエラーメッセージが表示される 23 InList[i] = &OutList[i]; 24 } 25... 26 27} 28

調べたこと

間接参照はポインタ変数の読み出し(1回目)、次に読み出した値のアドレスのメモリーを参照(2回目)すること。という知識を得ています。
今回だとInList[i]の読み出し(1回目)、InList[i]のアドレスのメモリーを参照になると思います。が、解決の糸口には結びつけることができませんでした。。

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

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

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

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

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

ozwk

2021/07/30 07:29

LIST_st と LINK_stが出てきますけど合ってますか?
ua_y

2021/07/30 07:34

指摘ありがとうございます!タイプミスしてました、修正しました。
guest

回答2

0

ベストアンサー

できあがったコードを静的解析ツールにかけたのですが、「NULLポインタの間接参照です」が表示され何で怒られているのか分かりません。

件の静的解析ツールは「abort()すると(mainから抜けて)後続する文は実行されない」ことを知らないのでしょう。
※ syntax留まりで、semanticsまでは解析してないってゆーか...

投稿2021/07/30 07:29

編集2021/07/30 08:03
episteme

総合スコア16614

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

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

ua_y

2021/07/30 08:06

解析ツールの中ではabort()の後も処理をつっぱしってしまうってことですかね。で、NULLのまま代入forに入るからNULLの間接参照エラー判定になる?
episteme

2021/07/30 08:24 編集

うん、abort()が中断/停止である(暗黙裡にreturnする)ってゆー"意味"までは解析していないんでしょうよ。 だから 明示的にreturnすればエラーが解消する。 まぁ、無理からぬことではありますが。
guest

0

abort();のあとに、return; を置いてみては

投稿2021/07/30 07:24

y_waiwai

総合スコア87800

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

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

ua_y

2021/07/30 08:08

return();置いて再解析したところ、ほんとにエラー消えました!解析ツールさんはabort()で止まらないんですね。
y_waiwai

2021/07/30 08:41

エラーチェッカやら解析ツールでは、明示的にreturnを置かないと終了判定してくれないってのは、まあよくあるはなしです。 ユーザが勝手にabort関数作って、そこで抜けないという事態を考えると、そうなっていて当然とも言えますが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問