我目前正在开始使用c和allegro5。我想将我的初始化代码放入init()方法,但我很难将指针返回到ALLEGRO_EVENT_QUEUE和ALLEGRO_DISPLAY。尽管指针在函数中初始化,但它们之后仍为NULL;我认为分配给指针的值将在当前作用域的末尾存活,因为底层值被修改,但内存地址保持不变。 这是我的代码:
#include <stdio.h>
#include <allegro5/allegro.h>
void init(ALLEGRO_DISPLAY *display_ptr, ALLEGRO_EVENT_QUEUE *queue_ptr) {
al_init();
al_install_keyboard();
display_ptr = al_create_display(640, 480);
queue_ptr = al_create_event_queue();
al_register_event_source(queue_ptr, al_get_display_event_source(display_ptr));
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
}
int main(int argc, char **argv){
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
init(display, event_queue);
printf("%d\n", display == NULL); //prints out 1
printf("%d\n", event_queue == NULL); //prints out 1
//Further code
return 0;
}
非常感谢任何提示或帮助。
答案 0 :(得分:3)
您需要传递指针本身的地址。
尝试这样
void init(ALLEGRO_DISPLAY **display_ptr, ALLEGRO_EVENT_QUEUE **queue_ptr) {
al_init();
al_install_keyboard();
*display_ptr = al_create_display(640, 480);
*queue_ptr = al_create_event_queue();
/* I assume you are guaranteed to not recieve `NULL's or why don't you check ? */
al_register_event_source(*queue_ptr, al_get_display_event_source(*display_ptr));
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
}
和
init(&display, &event_queue);
请记住,在c中你总是按值传递,所以传递的指针被复制,而它们包含相同的地址,它们存储在不同的地方,因此改变其中一个,不会影响另一个。
将地址传递给指针,可以修改存储在指针中的地址。
如果你想检查我说的是真的,尝试在每个函数中打印指针的地址,你会发现它们是不同的。
答案 1 :(得分:1)
通过值调用参数,即在您的情况下不返回指针地址。
要解决这个问题,你需要将指针传递给像这样的指针:
#include <stdio.h>
#include <allegro5/allegro.h>
void init(ALLEGRO_DISPLAY **display_ptr, ALLEGRO_EVENT_QUEUE **queue_ptr) {
al_init();
al_install_keyboard();
*display_ptr = al_create_display(640, 480);
*queue_ptr = al_create_event_queue();
al_register_event_source(*queue_ptr, al_get_display_event_source(*display_ptr));
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
}
int main(int argc, char **argv){
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
init(&display, &event_queue);
printf("%d\n", display == NULL); //prints out 1
printf("%d\n", event_queue == NULL); //prints out 1
//Further code
return 0;
}