【问题标题】:Scope and Linked Lists in CC 中的作用域和链表
【发布时间】:2015-12-01 17:58:24
【问题描述】:

我正在努力让在 C 中构建和使用链表变得更加自如,而且在大多数情况下,我认为我已经掌握了基础知识。但是,我在范围方面遇到了问题,特别是指针与结构指针的链接。

在我的linked_list.c 实现中,我使用main 函数来测试和使用我构建的链表函数。但最终目标是从另一个文件运行 Main,并且只从头文件外部引用我需要的几个函数。

我现在使用的实现确实有效,但它似乎依赖于我在我的(临时)main 函数中声明 struct list**

据我了解,如果您在块之外声明变量/指针,则可以使用 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 函数会返回一个段错误。

确实可以工作的代码版本非常相似,但它似乎依赖于在我的main 函数内部声明的**work_list,然后将其传递给initialize_list

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 块。尝试让dirty_init 函数工作时我会出错的任何想法?

【问题讨论】:

    标签: c pointers linked-list scope


    【解决方案1】:

    这里是:

    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);
    }
    

    改为?

    【讨论】:

    • 啊,但它确实有效!我有一堆函数用于添加节点并从我在 initialize_list() 函数之后运行的列表中弹出,它们似乎都可以工作。
    • 也许一个更好的方式来表达我的问题是,dirty_init 函数段错误和 initialize_list() 版本怎么做我认为它应该做的?
    • @user3407513 不,它不起作用。它只是不会立即崩溃。要看到这一点,请初始化 struct list **worklist = NULL 并观察 *out_list = my_list 取消引用 NULL 指针。您的代码在随机存储器上乱涂乱画。
    • @user3407513,您可以从一般规则的角度考虑。每当您将 指针作为参数传递,然后更改该指针指向的内容时,您必须将指针的 地址 传递给函数,否则在函数中您将对该指针的 copy 进行操作(具有不同的地址),并且在调用函数中不会看到更改(在您的情况下为main)。在链表中,这通常适用于链表初始化,(以及更改/删除循环链表中的第一个或最后一个节点)
    • 感谢大家的回复,但不幸的是他们还没有解决我的范围问题。我不想将指针作为参数传递。我想运行dirty_init() 并在任何功能块之外初始化一个内部链接的静态结构列表指针。我可能很密集,但我似乎无法让它发挥作用。
    猜你喜欢
    • 2013-04-17
    • 2010-12-01
    • 1970-01-01
    • 2010-09-21
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多