>>867
言語仕様で未規定や処理系定義としている場合があって、
そういうのは処理系や実行環境の都合に合わせて決めていいことになってる。
そして「未定義」とされている場合は何が起こってもいいことになってるので、
暴走するかもしれないし、 OS が止めてくれるかもしれないし、しれっと意味不明の結果を出力するかもしれない。
たぶんそれは未定義に該当すると思う。
C の可変長引数は型チェックをゆるゆるにすることで実現されていて、
処理系の内実をわかってる人は言語仕様上の保証がない (けど実態としては問題がない) コードを書くのは普通にある。
パソコンで一般的に使われている呼び出し規約 (関数を呼出す機械語レベルの挙動の規則) だと
ポインタと (レジスタの幅以下の大きさの) 整数は同じ方法で渡すので問題にならないんだけど、
言語仕様では保証がない。
可変長引数の型チェックはゆるゆるなんだけど printf は頻出するからコンパイラが特別扱いで
少しチェックを厳しくしているのでエラーになることもあったりする。
まあ基本的には保証されてないのでやらないほうがいいよ。
言語仕様で未規定や処理系定義としている場合があって、
そういうのは処理系や実行環境の都合に合わせて決めていいことになってる。
そして「未定義」とされている場合は何が起こってもいいことになってるので、
暴走するかもしれないし、 OS が止めてくれるかもしれないし、しれっと意味不明の結果を出力するかもしれない。
たぶんそれは未定義に該当すると思う。
C の可変長引数は型チェックをゆるゆるにすることで実現されていて、
処理系の内実をわかってる人は言語仕様上の保証がない (けど実態としては問題がない) コードを書くのは普通にある。
パソコンで一般的に使われている呼び出し規約 (関数を呼出す機械語レベルの挙動の規則) だと
ポインタと (レジスタの幅以下の大きさの) 整数は同じ方法で渡すので問題にならないんだけど、
言語仕様では保証がない。
可変長引数の型チェックはゆるゆるなんだけど printf は頻出するからコンパイラが特別扱いで
少しチェックを厳しくしているのでエラーになることもあったりする。
まあ基本的には保証されてないのでやらないほうがいいよ。