在内联结构内循环分配链表不分配内存

use*_*495 2 c malloc structure inline linked-list

我在循环中分配链表有奇怪的问题.

考虑一个简化的源代码:

struct main_s {
    minor_s minor_structure; (inline)
};

struct minor_s {
    list_s *first_dir;
};

struct list_s {
    anotherlist_s *first_object;
    list_s *next;
};

struct anotherlist_s {
    //multiple fields
};
Run Code Online (Sandbox Code Playgroud)

我有一个基本的init/deinit函数,如:

struct main_s *main_s_init();
void main_s_deinit();
Run Code Online (Sandbox Code Playgroud)

而现在我有点像循环分配:

im passing to this function main_s->minor_structure.first_dir and, how_many parameter, defining how many linked nodes going to be initiated.

void loop_inittiation(struct list_s *list, int how_many) {
    int i;
    struct list_s *tmp = list;
    for(i = 0; i < how_many; i++) {
        tmp = malloc(sizeof(struct list_s));
        tmp = tmp->next;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我有问题的地方,我分配临时"tmp"而不是尖头结构.我明白要通过tmp分配一个指针你必须使用双指针,但它仍然无法正常工作.我错过了什么?在gdb中没有分配内存空间:/.我必须使用**tmp吗?

xax*_*xon 5

你对错误有了正确的认识.函数中tmp的本地副本已更改,但是一旦您在外面,该值就会丢失.如果要在C中的其他函数内更改变量,则必须传递要更改的事物的地址.如果要更改的内容已经是指针,则必须传递指针的地址(或双指针).如果它是你想要改变的双指针,那么你必须传递一个三指针.如果它是一个123141指针,你必须传递一个123142指针:)

将参数更改为函数:

&(main_s->minor_structure.first_dir)
Run Code Online (Sandbox Code Playgroud)

只需将输入参数更改为

struct list **list
Run Code Online (Sandbox Code Playgroud)

将tmp更改为双指针以匹配它,然后每次使用tmp时,请确保引入额外的解引用..

struct list_s **tmp = list
Run Code Online (Sandbox Code Playgroud)

*tmp = malloc(sizeof(struct list_s));
*tmp = (*tmp)->next;
Run Code Online (Sandbox Code Playgroud)

所以它看起来像:

void loop_inittiation(struct list_s **list, int how_many) {
    int i;
    struct list_s **tmp = list;
    for(i = 0; i < how_many; i++) {
        *tmp = malloc(sizeof(struct list_s));
        tmp = &((**tmp)->next);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是单独留下tmp的东西,作为单个指针,存储你分配的第一个节点,然后说

*list = tmp;
Run Code Online (Sandbox Code Playgroud)

但是,你必须将第一次分配视为一种特殊情况.