こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

0byteのallocaやmemset

C言語でのmemsetやallocaのサイズに0byteを指定するとどういう動きなるのでしょうか。
自分で0byte指定のallocaを試した時には、戻り値にどこかのアドレスが返却されました。
memsetの方は、何もせず終了するだけだと思っているのですが・・・。
どなたか教えていただけると幸いです。

投稿日時 - 2009-11-16 00:40:09

QNo.5451381

困ってます

質問者が選んだベストアンサー

そもそも alloca って ISO C はおろか POSIX 標準にもないわけで, alloca(0) の挙動は「使っているシステムによる」としか言えないような気がする.
動作を考えれば「0 でないなんらかの値」が自然だけど, malloc(0) の返り値が実装依存 (0 もしくは 0 でないなんらかの値) であることを考えると alloca(0) が 0 を返しても文句は言えないんじゃないかなぁ.

投稿日時 - 2009-11-16 11:31:17

お礼

allocaの挙動はシステム依存なのですね・・・。
検索しても見つからない理由が分かった気がします。
ご回答ありがとうございました!

投稿日時 - 2009-11-22 00:26:35

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

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

投稿日時 - 2009-11-16 02:32:22

お礼

なるほど、自分が思ってた通りの挙動で少し安心しました。
オブジェクトを指さないアドレスを設定してはいけないのは、他の標準関数でも同じことだと思っているので、その辺は大丈夫です。
ご回答/補足ありがとうございました!

投稿日時 - 2009-11-22 00:29:32

-広告-
-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-