FromNandの日記

自分的備忘録

【C言語】構造体名は構造体への先頭アドレスを表すか?

構造体の文法について理解が及ばないところがあったので。

 

時に、下のプログラムは文法上の誤りを含んでいる。

#include<stdio.h>

struct STR {

    int a, b, c;

};

int main(void){

    struct STR str;

    printf("str = %p, &str = %p, &str.a = %p\n", str, &str, &str.a);

    return 0;

}

 

まぁ当然といえば当然なのだが、構造体名は構造体の先頭のアドレスを指すわけではない。

ただ、-Wallをつけない場合はこのプログラムが問題なく通ってしまうため混乱していた。

また、言い訳をすると、C言語には配列名が配列の先頭を指したり、関数名が関数の先頭アドレスを指したりする構文が存在するのでこれも行けるのだと勘違いしていた。

 

実際にこのプログラムをコンパイルすると、アセンブリレベルではstrの部分の引数が積まれていないものになっていた。

環境によっては「&str」「&str.a」という引数も何故か消滅していた。(構文解析のミスが発生した??)

 

で、結局何が言いたいのかというと、構造体名単体では構造体のアドレスを表すわけではないということ。