【发布时间】:2016-06-02 15:34:27
【问题描述】:
这个问题建立在我的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 中无效(
auto返回类型在 C 中不存在)以及第三个如何在 C++ 中无效(malloc),但我想知道为什么前两个在 C++ 中也应该是无效的? -
auto直到 C++17 才添加免费函数的返回类型推导
标签: c pointers pass-by-pointer