比较C中空指针指向的值

比较C中空指针指向的值,c,pointers,void-pointers,C,Pointers,Void Pointers,我需要比较C中两个void指针的值。在下面的代码中,我得到了控制台打印的结果,表明它们是不同的。似乎比较的是这两个void指针中包含的地址 如何使代码能够比较void指针的值(即:1==1),并打印“相同” 指针是不同的。如果您试图比较指针指向的整数,那么您需要 if ( *(int*)pi == *(int*)pj ) { //some code... } 您必须知道void指针真正指向的数据类型,强制指针指向该类型,然后取消对强制指针的引用(并假设使用=可以比较这些类型): 比较原

我需要比较C中两个
void
指针的值。在下面的代码中,我得到了控制台打印的结果,表明它们是不同的。似乎比较的是这两个
void
指针中包含的地址

如何使代码能够比较
void
指针的值(即:
1==1
),并打印
“相同”

指针是不同的。如果您试图比较指针指向的整数,那么您需要

if ( *(int*)pi == *(int*)pj ) {
    //some code...
}

您必须知道
void
指针真正指向的数据类型,强制指针指向该类型,然后取消对强制指针的引用(并假设使用
=
可以比较这些类型):

比较原始变量要容易得多:

if (i == j)
    …
或使用正确键入的指针:

int *pi = &i;
int *pj = &j;
if (*pi == *pj)
    …


如果我不知道数据的类型(假设用户总是传递相同类型的数据以与我的链表删除方法进行比较),会发生什么情况

然后生活变得艰难。理想情况下,您可以让程序员向您传递一个比较器函数-请参阅和 来自标准C库的示例

如果做不到这一点,您需要知道目标类型的大小,并且希望
memcmp()
能够很好地完成这项工作。这远不能保证-不清楚将两个
double
值与
memcmp()
进行比较是否总能得到正确的答案(例如,它可能声称NaN的不同表示形式是不同的),而将
struct
类型与填充进行比较是令人担忧的,而且,如果您从两个节点传递了数据字段,那么它将无法正确地用于链表数据类型


如果您需要进行排序而不仅仅是相等(例如,二元搜索树),那么情况就更糟了——在这种情况下,需要程序员提供比较器函数。

u必须将无效指针转换为int类型*

由于编译器不知道指针指向的地址类型,因此不知道从指针地址读取并比较多少字节。试试这个

    int i = 2;
    int j = 1;
    void *pi = &i;
    void *pj = &j;
    if ( (*(int*)(pi)) == (*(int*)(pj)) ) 
    {
        printf("same.\n");
    } else 
    {
        printf("different.\n");
    }
    return 0;

从您的评论来看,您试图实现一个链表,但不知道指针目标的数据类型。您的设计是错误的:使用
void*
指针,您无法(合理或可靠地)在不知道类型的情况下比较数据。你需要以不同的方式处理它。最好的方法是将链表实现为模板类。您的节点类将类似于

template <typename T> class Node
{
    private:
        T *m_pValue;
        Node *m_prev;
        Node *m_next;
    ...
}
template <typename T> class Node
{
    private:
        std::auto_ptr<T> m_pValue;
        Node *m_prev;
        Node *m_next;
    ...
}
这只是假设T类型可以通过==进行比较,这在大多数情况下应该是正确的

请注意,使用内存比较之类的建议非常危险——这种比较完全忽略了底层数据类型的结构和符号

好的,考虑到这必须是C语言,让你的节点

struct node
{
    void * m_pValue;
    node * m_pPrev;
    node * m_pNext;
}
并要求链表的用户必须向您提供指向比较器函数的指针

int (comparitor*)(void* lhs, void* rhs);

这正是Jonathan Leffler在下面提出的建议。具体如何构造这一切取决于如何构造链表。

没有空指针,就有int指针,然后是*pi==*pj。但是,虽然它是一个无效的指针,但它只是一个指针,然后尝试将指向的内容与
memcmp
进行比较是非常糟糕的做法,例如
if(memcmp(pi,pj,sizeof(int))==0){
更具体地说,我正在尝试实现一个链接列表,其中节点存储通用的void值。在delete方法中,我希望传递一个void项,该项与要删除的链接列表中的值进行比较。但是,当我尝试比较两个void指针时,即使它们指向的值相同,比较返回false。因此,我想知道是否有方法比较指针的值?@jl987:如果不明确地告诉编译器如何比较它们,就不可能比较
void*
指针指向的值。编译器不知道。只有你知道如何做。在最简单的情况下,你必须告诉编译器i通过指定强制转换中的确切类型来确定这些值的类型。或者,您可以为
delete
方法提供通用比较函数(您将提供该函数),就像使用标准的
bsearch
qsort
函数一样。如果我不知道数据类型(假设用户总是传递相同类型的数据以与我的链表删除方法进行比较),会发生什么情况?那么,是否无法比较这两个指针(假设它们是相同的类型,但您不知道是哪种类型,因此无法转换为各自的类型)?您怎么可能不知道指针是哪种类型..您正在编写程序。正如Jonathan指出的,如果您只需要使用一种类型的指针,您不需要void类型,只需从该类型(int*)开始但是如果你想不断地改变指针的类型,以指向不同的值,那么你需要在每次比较时明确地对它进行类型转换。谢谢C++中的建议!但是,我需要在C WOOPS中实现这个!当然,错过了这个小问题……当然,这就是为什么C++是我创建的,因为这样的问题。
Node rhs, lhs;
*(lhs.m_pValue) == *(rhs.m_pValue);
struct node
{
    void * m_pValue;
    node * m_pPrev;
    node * m_pNext;
}
int (comparitor*)(void* lhs, void* rhs);