1

我想在 C 中制作一个结构列表。在我的程序中,我从文件中读取行并将信息存储在结构中(每行一个结构)。所以我的代码是这样的:

struct myStruct *myStructList;

// Here is the parsing thing

而且,在解析结束时,我尝试这样做:

myStructList[i] = NULL;

其中 i 是列表中的下一个空闲位置(已使用 realloc 保留)。

这是我得到的错误。

incompatible types when assigning to type ‘struct myStruct’ from type ‘void *’

看来我不能做 NULL 的事情。我的问题是:如果它不为 NULL,我能放什么?我怎么知道列表已经完成?我知道我可以用列表中的元素数量来保持计数器,但我想避免这种情况。

4

2 回答 2

4

在 C 中,与 java 不同 - 数组按值保存元素,而不是按引用保存。

因此,您尝试将指针(地址)分配给结构,并且此操作未定义-因此您收到此错误。

如果要将元素设置为NULL,则应将数组声明为struct mySTruct*[],并分配指针而不是值。

于 2012-05-31T16:57:36.170 回答
1

struct myStruct *myStructList;定义一个指向一个或多个类型对象的指针struct myStructNULL是一个保证可以隐式转换为任何指针类型的常量。struct myStruct不是指针类型。

有两种常用的方法可以让您使用结束标记来发出阵列结束的信号。第一个是使用指向的指针数组struct myStruct。这样,可以将 NULL 指针用作结束标记。

另一个选项要求有一个明确的 NULL 值struct myStruct。因此,您可以像这样定义 NULL 初始化程序(需要 C99 或更高版本):

#define MYSTRUCT_NULL ((struct myStruct){ /* NULL initializer */ })
struct myStruct *myStructList = /* ... */
myStructList[i] = MYSTRUCT_NULL;

必须专门将数组的内容与 MYSTRUCT_NULL 进行比较以找出结束标记。

于 2012-05-31T17:26:28.373 回答