我正在尝试更自如地在 C 中构建和使用链表,并且在大多数情况下,我认为我已经掌握了基础知识。但是,我遇到了有关作用域的问题,特别是指针到结构指针的链接。
在我的 linked_list.c 实现中,我使用 main
函数来测试和试用我构建的链表函数。但最终目标是从另一个文件运行 Main,并且只从头文件中引用我需要的少数函数。
我现在使用的实现确实有效,但它似乎依赖于我在我的(临时))main
函数中声明 struct list**
。
据我了解,如果您在 block 外部声明变量/指针,则可以使用 static
命令将链接控制在内部,文件中的其他函数可以访问该链接。我希望能够做的是从程序外部调用类似 void initialize_list()
的函数,并让它在内部初始化此 linked list**
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
int value;
struct node *next;
};
struct list {
struct node *head;
struct node *tail;
int size; // Maintains current size of list
};
static struct list** work_list;
void dirty_init(void){
struct list* new_list = malloc(sizeof(struct list));
new_list->head = NULL;
new_list->tail = NULL;
new_list->size = 0;
*work_list = new_list;
}
运行我的 dirty_init
函数返回一个段错误。
确实有效的代码版本非常相似,但它似乎依赖于 **work_list
在传递给 main
函数之前被声明 初始化列表
。
void initialize_list(struct list **out_list){
struct list* my_list = malloc(sizeof(struct list));
my_list->head = NULL;
my_list->tail = NULL;
my_list->size = 0;
*out_list = my_list;
}
int main(void){
int i;
struct list **work_list;
initialize_list(work_list);
}
这一切都很好,但它有一个缺点,就是使我的 **work_list
指针在内部链接到 Main block 。我在尝试让 dirty_init
函数工作时出错的地方有什么想法吗?
最佳答案
这里是:
int main(void){
int i;
struct list **work_list;
initialize_list(work_list);
}
无法正常工作。 C 是按值传递,您传递一个未初始化的值,然后将其用作结果指针。你是说
int main(void){
int i;
struct list *work_list;
initialize_list(&work_list);
}
代替?
关于c - C 中的作用域和链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417313/