C语言 从外部文件访问链表



我有一个C程序头文件,它有这个链表和声明:

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

我从我的main.c文件中调用函数clearAll(),并且在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"语句。我只是想能够引用和访问链表和数组在它。

我这样做对吗?

[根据评论中的新信息编辑以使其清晰]

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

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

另外,看起来clearAll只作用于头节点,而不是列表的其余部分。因此,您可能还需要遍历列表中的其他节点。

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

void clearAll(seg* listHead);

将包含clearAll声明的头文件导入到main.c文件中。这样,您就有了一个更通用的函数,可以操作任何列表,而不仅仅是特定的列表。

相关内容

  • 没有找到相关文章

最新更新