3

我有以下函数从 C 中的链表中删除通用数据:

void removeData(void *data, struct accList *theList)
{
    struct accListNode* cur = theList->head;
    struct accListNode* prev = NULL;

    for(; cur != NULL; prev = cur, cur = cur->next)
    {
        if(cur->data == data)
        {
            if(cur == theList->head)
            {
               theList->head = cur->next;
            }
            if(cur == theList->tail)
            {
                theList->tail = prev;
            }
            if(prev != NULL)
            {
                prev->next = cur->next;
            }
            free(cur);
            return;
        }
    }
}

背后的含义是cur->data == data什么?

由于我的数据是通用的 ( void*),这对任何原始类型和任何结构类型意味着什么?

例如,考虑员工结构:

struct employee
{
    char name[20];
    float wageRate;
};

cur->data == data如果 data 是 type ,该语句将如何工作struct employee*?由于数据是指向结构的第一个内存地址的指针,我只是比较指针地址吗?

4

4 回答 4

7
cur->data == data

将指针cur->data与指针进行比较data。您正在比较它们的值,而不是它们的地址。指针是和其他变量一样的变量。它有一个地址(即&some_ptr)和一个值(即它所指事物的地址)。

请注意,其他类型的比较(即< > >= <=)会导致未定义的行为,除非指针指向同一数组的元素或指向末尾的元素(除非您知道它们指向驻留的“对象”,否则这样做没有意义无论如何,在同一块连续内存中,但仍然)。

于 2012-06-29T22:15:19.427 回答
3

cur->data == data 背后的含义是什么?

代码正在检查两个指针​​是否是同一个指针

由于我的数据是通用的(void*),这对任何原始类型和任何结构类型意味着什么?

如果数据是 struct employee* 类型,语句 cur->data == data 将如何工作?

没什么,比较的效果是一样的

由于数据是指向结构的第一个内存地址的指针,我只是比较指针地址吗?

不,你在比较指针

于 2012-06-29T22:21:55.323 回答
2

您正在比较指针本身,而不是指向的结构。

于 2012-06-29T22:15:43.347 回答
0

我猜你没有写removeData()?如果不是,那么我的解释是:

removeData() 旨在从链表中删除特定条目(即*data),而不是内容等于*data 的条目。因此,removeData() 的调用者必须已经知道他们想要 free() 的条目的确切位置。他们可以自己释放()它,但这并不好,因为链表仍然包含指向它的指针,并且可能链表的其他用户会认为释放()的对象仍然有效(他们会没有理由不相信,没有任何其他计划告诉他们)。

如果您想要一个函数在列表中搜索其内容与 *data 的内容匹配的条目(但与 *data 不在同一内存中),那么您需要为每种此类类型编写一个 removeData() 版本,并且您的 accList 需要是同质的(包含该类型的所有对象),或者 accList 还需要包含每个条目类型的一些指示,可能作为枚举,以及 removeData() 的每个版本(每种类型一个) 将需要跳过与其自身类型不匹配的元素。

于 2012-06-30T00:20:26.870 回答