C通过指针返回结构

时间:2015-04-16 19:38:52

标签: c pointers allegro5

我目前正在开始使用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;
}

非常感谢任何提示或帮助。

2 个答案:

答案 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;
}