2

我有一个 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"声明也是如此。我只想能够引用和访问链表和其中的数组。

我这样做对吗?

4

2 回答 2

2

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

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

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

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

于 2013-05-03T16:55:51.913 回答
0

如果我没看错的话,我认为你应该将一个节点clearAll作为参数传递给函数。更改函数签名以将其作为参数接受:

void clearAll(seg* listHead);

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

于 2013-05-03T16:55:36.787 回答