c - 从外部文件访问链接列表

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

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

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

我希望能够清除位数组中的所有位(将它们设置为 0)。每次编译时都会出现错误,提示 'p' 未声明(在此函数中首次使用),即使我有 #include "header.h" 语句。我只是希望能够引用和访问链接列表及其中的数组。

我这样做对吗?

最佳答案

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

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

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

此外,看起来 clearAll 仅适用于头节点,而不适用于列表的其余部分。因此,您可能还想遍历列表中的其他节点。

关于c - 从外部文件访问链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16363961/

相关文章:

c - C语言中最长的单词有多少个字符

子进程从其父进程继承句柄但无法写入其中

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

c - 我的单链表代码有什么问题?

c - 是否可以重新定义#warning?

c - 错误 Switch-Case - C 编程 - 初学者

c - write() 和 send() 解决错误 => 区别?

从已经创建的节点创建链表。获取段错误

java - getFrequencyOf() 链表中的字符串

algorithm - 链表的简单排序