無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ベース

無題

#1

投稿記事 by ベース » 15年前

あるサイトで気になったので、質問させていただきます。
http://oshiete1.goo.ne.jp/qa2727121.html
構造体のメンバにポインタや浮動小数点数が含まれていると、memset等でゼロクリア出来ないのはなぜなのでしょうか?
お決まりみたいものなのでしょうか?

ベース

memsetについて

#2

投稿記事 by ベース » 15年前

題名書くの忘れてました。

ドラ

Re:memsetについて

#3

投稿記事 by ドラ » 15年前

ヌルポインタや浮動小数点数の0.0の内部表現はすべてのビットがOFFになった
状態ではない可能性があるので、memset等で初期化したつもりが
実際にはヌルポインタや浮動小数点数の0.0になってない事もあります。

現在使っている環境でできたとしても、他の環境では通用しないかもしれないので
気をつけようという事でしょう。

ベース

Re:memsetについて

#4

投稿記事 by ベース » 15年前

回答ありがとうございます。0を代入したのにOFFにならない可能性とはプログラム自体がおかしな挙動する
ということなのでしょうか?

YuO

Re:memsetについて

#5

投稿記事 by YuO » 15年前

そもそも,空ポインタや浮動小数点数における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
も参考になるかと思います。

Naohiro19

Re:memsetについて

#6

投稿記事 by Naohiro19 » 15年前

ZeroMemory(構造体のポインタのアドレス,sizeof(構造体));
を使えば0で初期化されるはずです。

閉鎖

“C言語何でも質問掲示板” へ戻る