プロが教える店舗&オフィスのセキュリティ対策術

ポインタのサイズがintと同じになるのは知っているのですが、
以下のコードの場合、

typedef struct hoge{
char buf1[8];
char buf2[16];
}HOGE;

void test_func(HOGE *pHoge)
{
printf("型[%d],実際[%d]\r\n", sizeof(HOGE), sizeof(*pHoge));
memset(pHoge, 0x00, sizeof(*pHoge));
}

正しくサイズが取得できるのですが、
この使い方はC99の仕様的には正しいのでしょうか?

よろしくお願いします。

A 回答 (5件)

> ポインタのサイズがintと同じになるのは知っているのですが、



事実誤認です。

> 正しくサイズが取得できるのですが、

たまたまです。

> この使い方はC99の仕様的には正しいのでしょうか?

間違っています。
次のようにしてください。

printf("型[%zu],実際[%zu]\n", sizeof(HOGE), sizeof(*pHoge));

この回答への補足

回答ありがとうございます。

pHogeの中をクリアするのにsizeof(*pHoge)でサイズを取得してはいけないのでしょうか?

あと、%zuはしりませんでした。調べてみます。

補足日時:2011/04/19 20:36
    • good
    • 0

> pHogeの中をクリアするのにsizeof(*pHoge)でサイズを取得してはいけないのでしょうか?



pHogeをクリアするということであれば、

pHoge = NULL;

とします。
pHogeの参照先(*pHoge)をクリアするのであれば、構造体の内容に関わらず、

*pHoge = (HOGE){0};

とすれば確実にゼロクリアできます(メンバにポインタや浮動小数点数が含まれていたとしても)。


> あと、%zuはしりませんでした。調べてみます。

%dを使うと対応する実引数がint型(またはunsigned int型)でなければ未定義の動作を引き起こします。
C99ではいくつかの書式が追加されていますので、よく確認しておいてください。
zはsize_t型ですし、tならptrdiff_t型、jならintmax_t型になります。
    • good
    • 0

このプログラムで「正しくサイズが取得できる」の「正しく」とはどういう意味ですか?



余談だけど, 「浮動小数の 0」や「ポインタの NULL」を表すビットパターンが「全て 0」ということは誰も保証していない. 特に「ポインタの NULL」はプログラム上「0」と書いてもいいので誤解している人がいるんだけど, そんなことを前提にしてはいけない.

この回答への補足

「正しく」の意味ですが、
sizeof(HOGE)とsizeof(*pHoge))の結果が一致しているように
見えるのですが、同じ結果が帰るとと考えていいのかどうかです。

補足日時:2011/04/20 15:16
    • good
    • 0

*pHoge の型はなんだと思いますか?

この回答への補足

*pHogeの型はHOGE型なので、よいのですね。
実体を宣言した場合はsizeof演算子でサイズ取っていましたが、
ポインタにアスタリスクを付けても同様にサイズが取得できると
知りませんで。この質問を立てました。
私のあいまいな知識でサンプルコードを書いたばっかりに
みなさんにご迷惑おかけしました。

補足日時:2011/04/20 18:06
    • good
    • 0

sizeof演算子には


・sizeof(型)
・sizeof 式
の 2つの使い方があります.

前者では型を囲むかっこが必須で, これは当該型のバイト数を (size_t 型で) 返します.

一方後者は式を囲むかっこは不要 (あってもなくても同じ) で, 当該式を評価した結果の型のバイト数を (size_t 型で) 返します. この場合オペランドとなった式は (結果の型がわかればいいだけなので) 一部の場合を除いて評価されません.

ということで

#include <stdio.h>
int main()
{
int x = 4;
size_t y = sizeof ++x;
printf("x = %d, y = %zu\n", x, y);
return 0;
}

のように怪しいプログラムを書くこともできます.
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。

怪しいプログラム実行してみて驚愕しました。

お礼日時:2011/04/20 20:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!