从外部文件访问链接列表

时间:2013-05-03 16:50:04

标签: c linked-list

我有一个C程序header.h文件,其中包含此链接列表和声明:

typedef struct _seg
{
    int bits[256];        // # of bits in array = 256

    struct _seg *next;    // link to the next segment
} seg;  

EXTERN seg *head;         // this points to the start of the linked list

在我的main.c中,我有:

seg * p;
head = NULL;
...
for (i = 0; i < N; i++) {    // N is a parameter; irrelevant for this problem
    p = ( seg *) malloc(sizeof (seg));    // make a new segment
    p->next = head;        // add the new segment to the list
    head = p;
}

我从我的clearAll()文件调用了一个函数main.c,并在functions.c函数中调用了函数:

void clearAll() {
    int i;
    for (i = 0; i < 256; i++) {
        p->bits[i] = 0;
    }
}

我希望能够清除位数组中的所有位(将它们设置为0)。每次编译时都会出现'p' undeclared (first use in this function)的错误,即使我有#include "header.h"语句。我只想能够引用和访问链表及其中的数组。

我这样做了吗?

2 个答案:

答案 0 :(得分:2)

[根据评论中的新信息进行清晰编辑]

错误的准确原因:变量p是另一个函数中的局部变量。在这种情况下,p仅在执行该函数期间(在堆栈上)存在,因此在clearAll内未定义。

建议:正如@ErikN建议的那样,将列表头传递给clearAll。您已在另一个模块中为列表头分配了存储空间,使其成为全局变量。虽然这样可以工作(可能会收到编译器警告它未解析,但链接器会解析它),但这样做是不必要的耦合。

此外,看起来clearAll仅适用于头节点,而不适用于列表的其余部分。所以你可能也想在列表中走其他节点。

答案 1 :(得分:0)

如果我正确读取此内容,我认为您应该将一个节点作为参数传递给clearAll函数。更改功能签名以将其作为参数接受:

void clearAll(seg* listHead);

将包含此clearAll声明的标头导入main.c文件。 这样,您就拥有了一个更通用的功能,可以在任何列表上运行,而不仅仅是那个特定的列表。