- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
535 :デフォルトの名無しさん[sage]:2016/01/23(土) 16:08:11.20 ID:WP4XiwuV - >>531-534
%p は16進表示じゃなくてポインタの表示であって、引数に void* 以外渡すと 未定義動作になるから気をつけて使うように。 >>529 で &a を表示してる例も、キャストを入れて (void*)&a とするのが望ましい。 入れなくても動く環境がほとんどだけどね。
|
- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
537 :デフォルトの名無しさん[sage]:2016/01/23(土) 16:33:44.22 ID:WP4XiwuV - >>536
http://www.kouno.jp/home/c_faq/c5.html#17 > 古いHP 3000シリーズはバイトアドレスとワードアドレスで異なる > アドレス指定の方法を使っていた。だから同じアドレスを指していても、 > voidとcharのポインターは、intの(構造体なども)ポインターと違った > 内部表現を持っていた。
|
- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
542 :デフォルトの名無しさん[sage]:2016/01/23(土) 16:41:15.39 ID:WP4XiwuV - >>538
え? %p は渡された値を void* として操作するんだから、内部表現の違う int* を渡してたら 正常に動作しないのは当然じゃないの?動くように実装するのは不可能だと思うんだけど。 printf() 実装の中じゃ実引数の型なんかわからないんだし。
|
- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
544 :デフォルトの名無しさん[sage]:2016/01/23(土) 16:45:03.96 ID:WP4XiwuV - >>541
厳密には未定義動作。未定義動作だから期待通り動くこともあるし、実際そうなる環境が多い。 >537 のリンク先にあるような稀な環境まで含めて移植性を最大限にすることに価値が無いコードだと 言い切れるならダメということもないと思う。
|
- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
545 :デフォルトの名無しさん[sage]:2016/01/23(土) 16:49:43.47 ID:WP4XiwuV - >>543
動かないの証拠は無いかなぁ。 >537 のリンク先にあるような環境も手元に無いし。 文献でいいなら JIS C でどう? 7.19.6.1 fprintf 関数 http://kikakurui.com/x3/X3010-2003-01.html#206 > p > 実引数は,void へのポインタでなければならない。 ... ... > ... 実引数の型が対応する変換指定に対して正しくない場合,その動作は,未定義とする。
|
- C言語なら俺に聞け(入門編)Part 131 [転載禁止]©2ch.net
558 :デフォルトの名無しさん[sage]:2016/01/23(土) 21:08:46.46 ID:WP4XiwuV - >>556
「>>545が言ってる「未定義動作」は」も「undefinedの方の未定義動作は」も、同じだよね? undefined behavior = 未定義動作で、意味はそれしか無いと思ってるんだけど、どういうこと?
|