■環境
OS :Windows10
コンパイラ:gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
デバッガ :GDB
環境 :Emacs24.5で作成/デバッガ起動
他人の書いたコードを読んでいたところ、意味のよく分からないコードに遭遇しました。
キャストのアスタリスクが2つ並んでいます。
下記コードの★部分です。
c
1 unsigned char *mem_tp; 2 unsigned char *dbg_tp; 3 unsigned char *dbg_tp2; 4 5 unsigned char hoge_rx[15] = { /* データ格納バッファ */ 6 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 7 }; 8 9 mem_tp = *(unsigned char **)&(hoge_rx[9]); // ★意味がよく分からない他人のコード★ 10 dbg_tp2 = *(unsigned char *)&(hoge_rx[9]); // mem_tpと同じ結果になるのでは?と思い作ってみた(私が書いた) 11
上記コードをコンパイルし、gdbで変数の値をダンプしてみた結果が下記の通りです。
gdb
1(gdb) print/x mem_tp 2$1 = 0xd0c0b0a 3(gdb) print/x dbg_tp2 4$2 = 0xa
この部分以降のコードを読むと、mem_tp[0]~mem_tp[14]といった利用を行っています。
正しくは、dbg_tp2のコードではないかと考えたのですが、コンパイルすると、下記のワーニングが発生します。
gcc -g -o testdec.exe testdec.c
testdec.c: In function 'main':
testdec.c:31:13: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
dbg_tp2 = *(unsigned char *)&(check_rx[9]);
ポインターも配列も、全てunsigned charで統一しているのですが、なぜワーニングが出るのかも理解できません。
<理解したいこと>
1.mem_tp = *(unsigned char **)&(hoge_rx[9]); の意味。(キャストで*が2つ)
2.dbg_tp2 = *(unsigned char *)&(check_rx[9]); でなぜワーニング?
書いた人の意図が読み取れずモヤモヤしております。
理解できる方、是非ご教示願います。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/17 03:51