サンプル集  >  LinuxC  >  構造体
構造体
2016/02/23

構造体を使って値のやりとりをします。

◆環境
OS 8.2
Linux TSV01 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) x86_64 GNU/Linux
gcc 4.9.2 (Debian 4.9.2-10)

以下の動作を確認します。

  1. main関数で構造体変数を定義
  2. 関数へ構造体変数を渡し、関数内で値を設定
structTest.c
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
#include <stdio.h>
#include <string.h>

struct myParam
{
    char cType;
    int  iNmbr;
    char pMsg[16+1];
};

typedef struct myParam myParam_t;

/* 引数の構造体に値を設定する */
void setParam( char       cType_in
             , int        iNmbr_in
             , char*      pMsg_in
             , myParam_t* param_out
             )
{
    printf( "set :addr:%p\n", param_out );
    param_out->cType = cType_in;
    param_out->iNmbr = iNmbr_in;
    strcpy( param_out->pMsg, pMsg_in );
}

/* 引数の構造体の内容を表示する */
void dspParam( myParam_t param )
{
    printf( "dsp :addr:%p\n", &param );
    printf( "Type=%c Nmbr=%d Msg=[%s]\n"
          , param.cType
          , param.iNmbr
          , param.pMsg
          );
}

/* 構造体のアドレスを表示する(テスト用) */
void dsp2Param( myParam_t *param )
{
    printf( "dsp2:addr:%p\n", param );
}

int main( void )
{
    myParam_t param;
    printf( "main:addr:%p\n", &param );

    setParam( 'A', 1, "apple", &param );
    dspParam( param );
    dsp2Param( &param );

    setParam( 'B', 2, "bread", &param );
    dspParam( param );

    setParam( 'C', 3, "coffee", &param );
    dspParam( param );

    return( 0 );
}

makefileです。

makefile
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
# 2016/02/23 (c) ymlib.com
TARGET = structTest
OBJS = structTest.o
CC = /usr/bin/gcc

$(TARGET): $(OBJS)
        $(CC) -o $@ $(OBJS)
.SUFFIXES: .c.o
.c.o:
        $(CC) -Wall -c $< -g

clean:
        rm -f $(TARGET) $(OBJS)

makeします。

# make
/usr/bin/gcc -Wall -c structTest.c -g
/usr/bin/gcc -o structTest structTest.o

実行します。

# ./structTest
main:addr:0x7ffc836ddc00
set :addr:0x7ffc836ddc00
dsp :addr:0x7ffc836ddbe0
Type=A Nmbr=1 Msg=[apple]
dsp2:addr:0x7ffc836ddc00
set :addr:0x7ffc836ddc00
dsp :addr:0x7ffc836ddbe0
Type=B Nmbr=2 Msg=[bread]
set :addr:0x7ffc836ddc00
dsp :addr:0x7ffc836ddbe0
Type=C Nmbr=3 Msg=[coffee]

期待通りに動きました。

main関数で宣言した構造体変数(以下、param)のアドレスは 0x7ffc836ddc00 です。 setParam関数に引き渡したときのアドレスも同じです。 そのため、setParam関数内で設定した値は paramの値を書き換えているものと考えられます。

dspParam関数の引数のアドレスは paramのものと違います。 これは dspParam関数へは paramのポインタを渡していないためだと思います。

▲ PageTop  ■ Home


Copyright (C) 2016 ymlib.com