明らかにポインターを使用して、別の関数内から構造体を割り当てる必要があります。私はこの問題を何時間も見つめ、何百万通りもの方法で解決しようとしました。
これはいくつかのサンプルコードです (非常に単純化されています):
...
some_struct s;
printf("Before: %d\n", &s);
allocate(&s);
printf("After: %d\n", &s);
...
/* The allocation function */
int allocate(some_struct *arg) {
arg = malloc(sizeof(some_struct));
printf("In function: %d\n", &arg);
return 0;
}
これにより、割り当て呼び出しの前後で同じアドレスが得られます。
Before: -1079752900
In function: -1079752928
After: -1079752900
おそらく関数内でコピーを作成するためだと思いますが、引数として指定したポインターを実際に操作する方法がわかりません。some_struct の代わりに some_struct * を定義しようとしましたが、うまくいきませんでした。私は試しました:
int allocate(some_struct **arg)
これは問題なく動作します(割り当て関数も変更する必要があります)が、割り当てに従って宣言を変更することはできず、* argである必要があります。宣言するだけでよい場合は、最も正しいでしょう。 some_struct s.. some_struct * ではありません。割り当て関数の目的は、構造体 (some_struct) を初期化することです。これには、割り当ても含まれます。
言い忘れたことをもう一つ。割り当て関数の戻り値 0 は、一部のステータス メッセージ用に予約されているため、これを使用してアドレスを返すことはできません。