我有以下函数从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
,语句struct employee*
如何工作?
由于数据是指向结构的第一个内存地址的指针,我只是比较指针地址?
答案 0 :(得分:7)
cur->data == data
将指针cur->data
与指针data
进行比较。你要比较他们的价值,而不是他们的地址。指针是一个像任何其他变量一样的变量。它有一个地址(即&some_ptr
)和一个值(即它所指的东西的地址)。
请注意,其他类型的比较(即<
>
>=
<=
)会导致未定义的行为,除非指针指向同一个数组或过去的一个元素结束(并不是说除非你知道他们指的是那些居住在同一块连续记忆中的“物体”,否则这样做会有意义,但仍然如此)。
答案 1 :(得分:3)
cur-&gt; data == data?
背后的含义是什么?
代码检查是两个指针都是相同的指针
由于我的数据是通用的(void *),这对任何原语都意味着什么 类型和任何结构类型?
如果数据属于类型,语句cur-&gt; data == data如何工作? struct employee *?
没什么,比较效果相同
由于data是指向结构的第一个内存地址的指针 我只是比较指针地址?
不,你在比较指针
答案 2 :(得分:2)
你正在比较指针hotself,而不是指向的结构。
答案 3 :(得分:0)
我猜你没写过removeData()?如果没有,那么我的解释是:
removeData()用于从链表中删除特定条目(即*数据),而不是内容等于* data的条目。所以removeData()的调用者必须已经知道他们想要free()'ed的条目的确切位置。他们可以自己释放(),但这不会很好,因为链表仍然包含指向它的指针,并且可能是链表的其他用户会认为free()'ed对象仍然有效(他们会有没有理由不相信,没有任何其他告诉他们的计划)。
如果你想要一个函数在List中搜索其内容与* data的内容相匹配的条目(但与* data不在同一个内存中),那么你需要为每个条目写一个版本的removeData()这样的类型,你的accList要么是同构的(包含那种类型的所有对象),要么accList还需要包含每个条目类型的一些指示,可能作为枚举,每个版本的removeData()(一个对于每种类型)将需要跳过与其自身类型不匹配的元素。