ページ 1 / 1
無題
Posted: 2009年11月19日(木) 01:00
by ベース
あるサイトで気になったので、質問させていただきます。
http://oshiete1.goo.ne.jp/qa2727121.html
構造体のメンバにポインタや浮動小数点数が含まれていると、memset等でゼロクリア出来ないのはなぜなのでしょうか?
お決まりみたいものなのでしょうか?
memsetについて
Posted: 2009年11月19日(木) 01:02
by ベース
題名書くの忘れてました。
Re:memsetについて
Posted: 2009年11月19日(木) 01:26
by ドラ
ヌルポインタや浮動小数点数の0.0の内部表現はすべてのビットがOFFになった
状態ではない可能性があるので、memset等で初期化したつもりが
実際にはヌルポインタや浮動小数点数の0.0になってない事もあります。
現在使っている環境でできたとしても、他の環境では通用しないかもしれないので
気をつけようという事でしょう。
Re:memsetについて
Posted: 2009年11月19日(木) 01:39
by ベース
回答ありがとうございます。0を代入したのにOFFにならない可能性とはプログラム自体がおかしな挙動する
ということなのでしょうか?
Re:memsetについて
Posted: 2009年11月19日(木) 03:08
by YuO
そもそも,空ポインタや浮動小数点数における0の実際のビットパターンは,実装に委ねられています。
そのため,memsetされたあとのポインタや浮動小数点数は「どんな値が入っているかわからない」という,使い物にならない状態になっています。
# 整数型であれば,全ビットが0であれば値0であることが保証されています。
0をポインタ型や浮動小数点数型に代入したのであれば,空ポインタや浮動小数点数型の0になっていることは確実ですが,
それがmemsetによって0を埋め込んだものと同じであるとは限りません。
# memsetとcallocはよく見るわりに使えるものではないと思う代表的な関数だと思う。
C FAQの5.17には,具体的に空ポインタのビットパターンが全ビット0で無い例があげられています。
http://www.kouno.jp/home/c_faq/c5.html#17
また,株式会社きじねこさんのC/C++迷信集にある,
[迷信] とりあえず memset で初期化 | 株式会社きじねこ
http://www.kijineko.co.jp/tech/supersti ... emset.html
や,その参考資料にある,
memset で検索して来られる方へ | 株式会社きじねこ
http://www.kijineko.co.jp/node/163
も参考になるかと思います。
Re:memsetについて
Posted: 2009年11月30日(月) 07:47
by Naohiro19
ZeroMemory(構造体のポインタのアドレス,sizeof(構造体));
を使えば0で初期化されるはずです。