C
1void Message(message *temp, int tx_id, int data_size ){
2
3 temp.id = tx_id; //START
4
5
6 for (i = 0; i < data_size; i++)
7 {
8 // 可変にする
9 pdata[i] = temp.byte(i);
10 } //END
11
12}
Message関数のtempは(恐らく)構造体messageのポインタなので、
//STARTから//ENDまでのセンテンスがMessage関数のスコープ内なら
コンパイル通らないと思いますよ。
本当に動いているんですか?
*付きの変数はポインタ変数と呼ばれるものです。
ポインタ変数には、メモリ上のアドレスが格納されていて、
ポインタ変数を利用することによって、内容の参照や更新を行うことができます。
例
C
1#include <stdio.h>
2
3void hogehoge(int value);
4void fugafuga(int *value);
5
6void hogehoge(int value) {
7 value = 1;
8 return;
9}
10
11void fugafuga(int *value) {
12 *value = 2;
13 return;
14}
15
16void main(int argc, char **argv) {
17 int value = 0;
18
19 hogehoge(value);
20 (void)printf("hogehoge:%d\n", value);
21
22 fugafuga($value);
23 (void)printf("fugafuga:%d\n", value);
24
25 exit(0);
26}
これをコンパイルして実行すると、、、
hogehoge:0
fugafuga:2
となります。
hogehoge関数の引数valueはポインタではないので、値0そのものが
渡されます。(というか0という値がスタックに積まれます)
hogehoge関数内で0を1に変えようと、hogehoge関数からリターンすると、
スタックは解放されてしまいますし、そもそもmain関数のvalueは
なにも影響を受けません。
一方fugafuga関数の引数valueはポインタ変数なので、ここにはmain
関数のvalueが配置されているメモリアドレスが格納されます。
fugafuga関数はこのメモリアドレス上の値を2に書き換えるので、
リターンした後のprintfで2と表示されるのです。
まずはポインタ変数を学習しましょう。