我在循环中分配链表时遇到奇怪的问题。
考虑简化的源代码:
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
};
我有一个基本的 init/deinit 函数,例如:
struct main_s *main_s_init();
void main_s_deinit();
现在我对循环分配感到有点困惑:
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;
}
}
这就是我遇到问题的地方,我分配临时“tmp”而不是指向的结构。我知道要通过 tmp 分配指针,您必须使用双指针,但它仍然不起作用。我缺少什么?在 gdb 中没有分配内存空间:/。 我必须使用 **tmp 吗?
最佳答案
您对问题的认识是正确的。函数中 tmp 的本地副本已更改,但一旦离开,该值就会丢失。如果您想更改 C 中不同函数内的变量,则必须传递要更改的内容的地址。如果你想要改变的东西已经是一个指针,你必须传递指针(或双指针)的地址。如果你想改变的是双指针,那么你必须传递三重指针。如果是 123141 指针,则必须传递 123142 指针:)
将函数的参数更改为:
&(main_s->minor_structure.first_dir)
只需将输入参数更改为
struct list **list
将 tmp 更改为双指针以匹配它,然后每次使用 tmp 时,确保抛出额外的取消引用..
struct list_s **tmp = list
和
*tmp = malloc(sizeof(struct list_s));
*tmp = (*tmp)->next;
所以它看起来像:
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);
}
}
另一种方法是单独保留 tmp 内容,作为单个指针,存储您分配的第一个节点,然后只说
*list = tmp;
但是您必须将第一次分配视为特殊情况。
关于c - 内联结构内链表的循环分配不分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16504581/