pit-rayの備忘録

開発中に得た知識を記事にしていくブログ

<C言語>構造体のアドレスは何を指すのか

本日はまたC言語についてのちょっとしたトピックを取り上げます。

構造体のアドレスは何を指しているのか?です。

まず、以下のプログラムを見ていきましょう。

#include <Windows.h>
#include <stdio.h>

typedef struct STRUCT_P_TEST {
    int a ;
    int b ;
} st_test ;

int main() {
    st_test st = { 5, 6 } ;

    //構造体、メンバのアドレスをポインタとしてコピー
    int* p_st   = ( int* )&st ;
    int* p_st_a = ( int* )&st.a ;
    int* p_st_b = ( int* )&st.b ;

    printf( "struct adress   = %p\n", p_st ) ;
    printf( "member a adress = %p\n", p_st_a ) ;
    printf( "member b adress = %p\n", p_st_b ) ;

    printf( "_ _ _ _ _ _ _ _ _ _ _ _ _\n" ) ;
    printf( "struct value    = %d\n", *p_st ) ;
    printf( "member a value  = %d\n", *p_st_a ) ;
    printf( "member b value  = %d\n", *p_st_b ) ;
    
    Sleep( 5000 ) ;

    return 0 ;
}

実行結果

struct adress   = 00AFFE74
member a adress = 00AFFE74
member b adress = 00AFFE78
_ _ _ _ _ _ _ _ _ _ _ _ _
struct value    = 5
member a value  = 5
member b value  = 6

動作環境
OS:Windows10
CPU:Core i5-4590

Windows.hはSleep関数を用いるためにインクルードしています。
このように構造体自体のアドレスというのは最初のメンバのアドレスと一致します
そのため、構造体のint型の値を取り出すと、当然最初のメンバの値が出てきます。

しかし、ここで注意したいのはint型(4バイト)で取り出しているこそ同じ値になっているだけで、取り出すサイズが違えば値も異なります
一致しているのはアドレスということに注目してください。

イメージとしてはこのような形です。

f:id:pit-ray:20180712230704j:plain
構造体のメモリ構造イメージ

では今日のまとめです。

構造体のアドレス=最初のメンバのアドレス


・参考文献
c - 構造体のアドレスと構造体の最初のメンバーのアドレスは同一であるとして良いか? - スタック・オーバーフロー