这个问题是建立在我的一个previous question。为什么我必须在这种情况下传递指针指针
那里我有这个构造。它使用SDL2:
void init_window(SDL_Window *window)
{
window = SDL_CreateWindow(…);
}
int main(void)
{
SDL_Window *window;
init_window(window);
}
这没有奏效。答案建议,我使用*&window
作为函数参数,而且效果很好。 我改写了*&window
到**window
如下所示:
void init_window(SDL_Window **window)
{
*window = SDL_CreateWindow(…);
}
int main(void)
{
SDL_Window *window;
init_window(&window);
}
而且它也适用。但我仍然不明白为什么第一个版本不起作用。我查了一下implementation details of 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知识的情况下回答这个问题,所以似乎有一些我错过的实现细节。希望有人能够启发我。
选择一种语言标签,C和C++是不同的。 (您的最后一个程序在C++中是无效的) –
'auto init_window(SDL_Window ** window)'在C++中(在C++ 17之前!)和C中是非法的。您的编译器应对此进行评论。也许你打算返回'void';或者按照你在测试程序中使用的模型,并且使用'SDL_Window * init_window(void)' –
我可以看到前两个在C中是无效的(C中不存在'auto'返回类型)以及第三个在C++('malloc')中是无效的,但我想知道为什么前两个在C++中也应该是无效的? – hgiesel