c - C 中的作用域和链表

标签 c pointers linked-list scope

我正在尝试更自如地在 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/

相关文章:

c++ - 中断 accept()

c - 第一个线程信号未被捕获,所有其他线程信号被捕获

c - 读取由 12 个数字组成的数组,每个数字之间有空格 - C 编程

C++——将流指针作为函数参数给出是什么意思?

c - 制作我自己的 strlen 函数,以接收字符串作为链接列表

java - 如何使用 ListIterator 在 LinkedList 中间插入元素

c++ - 帮助解决 c 错误

c - 文本打印在最后,而通常它应该打印在顶部

c++ - 使用指针返回值 - 程序崩溃

java - 如何使用 get 方法从链表中获取元素