C 如何比较С;中的*(void*);?

C 如何比较С;中的*(void*);?,c,C,我有两个变量,类型为void*,类型大小为void* int function(void* p1, void* p2, int size) { if (*p1 > *p2) { return 0; } else { return 1; } } 当我不知道类型(double/int)时,我如何比较它(内存指示指针),或者它是不可能的)?与两个void*p1和void*p2通用指针,您可以使用 if (p1 == p2) { // here p1 and p2

我有两个变量,类型为
void*
,类型大小为
void*

int function(void* p1, void* p2, int size) {
  if (*p1 > *p2) {
    return 0;
  } else {
    return 1;
  }
}

当我不知道类型(double/int)时,我如何比较它(内存指示指针),或者它是不可能的)?

与两个
void*p1
void*p2
通用指针,您可以使用

if (p1 == p2) {
  // here p1 and p2 are pointer aliases, pointing to the same location
  // and we suppose that location is a string
  char*s = p;
  printf("string %s\n", s);
}
但是你应该对这些指针有更多的了解。特别是他们所指向的数据的实际类型,您应该关心

了解点位置的大小是不同的。您的软件应该记录这方面的约定(因为
void*
通用指针不知道指针数据的大小或类型)

要按内容比较内存区域,请使用。您需要确保这两个指针是有效的(实际上,在您的中,在Linux上请参见和
/proc/self/maps
..)


在某些系统(典型示例:Linux/x86-64)上,您可以通过将通用指针转换为
char*

来比较通用指针。如果您有两个指针,并且您知道它们指向的内存区域的大小,您可以使用
memcmp
来比较它们指向的内存内容:

//如果a和b的内容相同,则返回true
bool比较(常量无效*a,大小\u t a\u大小,常量无效*b,大小\u t b\u大小)
{
如果(a_尺寸!=b_尺寸)
{
//大小不一,没什么可比的
返回false;
}
返回memcmp(a,b,a_size)==0;
}

此表达式无效:

*p1 > *p2
因为您正试图取消引用不允许的
void*
。为了进行有意义的比较,您需要知道这些指针指向什么类型

但是,函数的
size
参数意味着您知道前两个参数指向的类型的大小(以字节为单位),并且这两个参数都指向相同类型的对象。因此,您可以使用
memcmp
逐字节比较两个地址各自指向的内容

int function(void* p1, void* p2, int size) {
  if (memcmp(p1, p2, size) > 0) {
    return 0;
  } else {
    return 1;
  }
}
但是请注意,比较的结果在很大程度上取决于指向对象的类型和系统的终止性


例如,给定值为1和256的
int
对象,此函数将在小端系统上返回0,在大端系统上返回1。

您所说的“比较”是什么意思?空指针只是一个内存地址。您打算如何处理两个内存地址?您不能取消对
void*
的引用。你的编译器应该至少给你一个警告。你能在两个void指针变量之间做的唯一有意义的比较就是看看它们是否相等,这意味着它们指向相同的内存地址。当使用预定义的排序算法(如qsort())时,使用带有2个void*参数的比较函数的模式是典型的。排序逻辑已经编写好,您提供了知道如何比较两个元素的函数。不过,在本例中,实现者知道列表中存储的数据类型,因此可以将它们转换回该类型以进行比较。这是我对问题来源的猜测。没有任何方法可以知道原始数据类型的比较函数是没有意义的。我如何将其中一个数字与0或0.0进行比较?@THND其中一个数字?如果您描述如何调用您的函数,可能会有所帮助。我的意思是memcmp(p1,0,size)@THND 0是一个空指针常量,因此您不能取消引用它。同样,这个函数是如何使用的?“我是指memcmp(p1,0,size)”。您想知道
p1
是否指向充满零的内存区域吗?