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

以下のような定義の構造体があります。
この構造体のメンバであるchar型配列Cが、
【実行】にあるようにif文で使われている時にelseの処理2を実行する事ができませんでした。

char型の変数だと、'\0'が入っていればelseとなるのですが、
配列となっているCにstrcpyで'\0'や0,NULLを設定してみてもelseにはなりませんでした。

この様なif文でelseの処理2を実行するにはどうすれば良いのでしょうか?

初歩的な質問かも知れませんが、回答頂けると幸いです。

【定義】
typedef struct
{
struct
{
char C[100];
}B
}A

【実行】
static A* hoge;

hoge = (A*)malloc(sizeof(A));

if(A->B.C)
{
処理1
}else{
処理2
}

A 回答 (2件)

ポインタ/配列と数値の違いを理解するようにしましょう。



char C[100]とあるように、Cはcharの配列です。

> A->B.C

と、Cだけ書いた場合は、配列の先頭アドレスになります。
A->B.C == &(A->B.C[0])
配列として領域がちゃんと確保されているので、アドレスはNULLにはなっていません。
NULLでないので、真となり、当然ifの方が実行されます。

Cを文字列として利用していて、空文字列(長さ0の文字列)かどうかの判定したいのだったら、例えば次のような方法を使います。
if ( A->B.C[0] != '\0' ) /* 先頭が\0 → 長さが0 */
if ( A->B.C[0] != 0 ) /* 別表記 */
if ( A->B.C[0] ) /* 0でない→真 ということを利用 */
if ( strcmp(A->B.C,"") != 0 ) /* 「空文字列では無い」という意味を明記 */



> Cにstrcpyで'\0'や0,NULLを設定
これ、具体的にどうやったんですか?

strcpy(A->B.C, '\0');
strcpy(A->B.C, 0);
strcpy(A->B.C, NULL);
だとしたら、「Cに空文字列を設定」の意味にはなりません。
    • good
    • 0
この回答へのお礼

A->B.CがNULLということは、配列として領域が確保されていないことなるので、
if(A->B.C)では空文字列の判定ができないのですね。

ご丁寧な説明ありがとうございました。


> Cにstrcpyで'\0'や0,NULLを設定
これ、具体的にどうやったんですか?

おっしゃられる様に設定していました・・・。
アドレスに'\0'を指定しても空にはならないですね。。。
精進します。

お礼日時:2012/03/04 22:53

A->B.C



ってのは「構造体Aの持つ構造体Bの持つchar配列Cの先頭アドレス」ですから常に0ではありません。
そんだけの事です。
    • good
    • 0
この回答へのお礼

まさしく、そのとおりでした。
初歩的な質問にご回答ありがとうございました。

お礼日時:2012/03/04 22:53

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