この質問は、私からの以前の質問に基づいています。
そこに私はこの構造を持っていました。SDL2 を使用します。
void init_window(SDL_Window *window)
{
window = SDL_CreateWindow(…);
}
int main(void)
{
SDL_Window *window;
init_window(window);
}
これはうまくいきませんでした。答えは、*&window
代わりに関数パラメーターとして使用したことを示唆しており、うまく機能しました。*&window
to**window
を次のように書き直しました。
void init_window(SDL_Window **window)
{
*window = SDL_CreateWindow(…);
}
int main(void)
{
SDL_Window *window;
init_window(&window);
}
そして、それも機能します。しかし、最初のバージョンが機能しない理由はまだわかりません。SDL_Windowの実装の詳細を調べたところ、通常typedef
の名前空間に配置するのは構造体の通常の方法です。SDL_CreateWindowは を返しますSDL_Surface *
.
私のジレンマを想像するために、次の簡単なプログラムを書きました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person
{
char *name;
int age;
} Person;
Person *person_create(char *name, int age)
{
Person *who = malloc(sizeof(Person));
who->name = strdup(name);
who->age = age;
return who;
}
void person_get_old(Person *who)
{
who->age += 30;
}
int main(void)
{
Person *susan = person_create("Susan", 23);
person_get_old(susan);
printf("%i\n", susan->age);
}
これは53
、ポインタからポインタへのセマンティクスを使用しなくても、期待どおりに出力されます。私の実装と SDL2 の実装の違いは何ですか。これは SDL2 の質問ではありません。以前の質問に答えた人は、SDL2 の知識がなくてもこれに答えることができたので、見逃した実装の詳細があるようです。誰かが私を啓発できることを願っています。