首页 > 解决方案 > 如何在给定变量作为引用的函数内初始化结构

问题描述

我对 c 还有些陌生,我正在尝试为函数内部的结构分配一些内存并通过引用传递它。

我的解决方案不起作用,因为我在那里初始化的结构没有传递给其他函数,并且我在尝试访问内存时遇到错误,这是没有分配的。

这是有问题的代码:


#include <stdlib.h>

typedef struct list list;

struct list {
     int x;
};

void init_list(list* mylist){
    mylist = malloc(sizeof(list));
    mylist->x = 1;
}

void free_list(list* mylist){
    free(mylist);
}

main(){
    list mylist;
    init_list(&mylist);

    //use the value of x for something

    free_list(&mylist); 
}

我试过这样做:

init_list(list* mylist){
   list *temp = malloc(sizeof(list));
   -initiliaze variables-
   *mylist = *temp
}

在这种情况下,其他函数可以访问该结构,但我无法释放它,因为我没有正确的指针。当我尝试运行它时,它只是说“free()无效大小”。

那么在这种情况下分配内存和传递地址的正确方法是什么?我也知道我可以退回它,但我想知道它是否以及如何通过参考来实现。

我也使用 clang 编译。

提前致谢。

标签: cstructreference

解决方案


当你调用 时init_list(),它会分配一个大小为 的内存块struct list,并将 x 的值设置为 1。你很好。但是您的函数输入似乎有点问题。当您将参数传递给 C 中的函数时,您实际上传递了它的副本。更改函数内部的值不会将值更改回main(). 这意味着您传递给函数的内容必须是对您希望函数更改的内容的引用。struct list在这种情况下,您希望您的函数在调用时将指针更改为 a malloc()。您正在寻找的解决方法是这样的:

int main(void) {
list *pointer_to_list; //declares pointer, NOT a struct
init_list(&pointer_to_list); //passes the reference value of the pointer (essentially a 'struct list**')
free_list(pointer_to_list);
}

其中init_list()定义为:

void init_list(list **mylist) {
*mylist = malloc(sizeof(list)); //sets the pointer called pointer_to_list in main() to the ouput of malloc()
(**mylist).x = 1;

//Note that we never change the value of mylist
//because it won't change anything in main() anyway
}

推荐阅读