- ベストアンサー
0byteのallocaやmemset
C言語でのmemsetやallocaのサイズに0byteを指定するとどういう動きなるのでしょうか。 自分で0byte指定のallocaを試した時には、戻り値にどこかのアドレスが返却されました。 memsetの方は、何もせず終了するだけだと思っているのですが・・・。 どなたか教えていただけると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そもそも alloca って ISO C はおろか POSIX 標準にもないわけで, alloca(0) の挙動は「使っているシステムによる」としか言えないような気がする. 動作を考えれば「0 でないなんらかの値」が自然だけど, malloc(0) の返り値が実装依存 (0 もしくは 0 でないなんらかの値) であることを考えると alloca(0) が 0 を返しても文句は言えないんじゃないかなぁ.
その他の回答 (1)
- Yune-Kichi
- ベストアンサー率74% (465/626)
ISO/IEC 9899:1999にallocaという関数,マクロetc.は存在しません。 memsetについては, > The memset function copies the value of c (converted to an unsigned char) into each of the first n characters of the object pointed to by s. という動作をするので, sによって指定されたオブジェクトの先頭0バイトに値が設定される, つまりは何もしないことになります。 ただし,s (第1引数) がオブジェクトをさしていない場合,厳密には未定義の振る舞いとなります。 つまり,n (第3引数) がたとえ0であっても,sに空ポインタを指定したり,オブジェクトを指さないポインタを指定してはいけない,ということです。 references) ISO/IEC 9899:1999 7.21.6.1 The memset function ISO/IEC 9899:1999 7.21.1 String function conventions / Paragraph 2 ISO/IEC 9899:1999 7.1.4 Use of library functions / Paragraph 1
お礼
なるほど、自分が思ってた通りの挙動で少し安心しました。 オブジェクトを指さないアドレスを設定してはいけないのは、他の標準関数でも同じことだと思っているので、その辺は大丈夫です。 ご回答/補足ありがとうございました!
お礼
allocaの挙動はシステム依存なのですね・・・。 検索しても見つからない理由が分かった気がします。 ご回答ありがとうございました!