C 这个代码有什么问题
这是一段大型代码。我想了解为什么C 这个代码有什么问题,c,C,这是一段大型代码。我想了解为什么compare\u int没有得到正确的指针 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> static int compare_int ( void *left, void *right ) { int *l = (int*)left; int *r = (int*)right;
compare\u int
没有得到正确的指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
static int
compare_int ( void *left, void *right ) {
int *l = (int*)left;
int *r = (int*)right;
if ( *l < *r )
return -1;
else if ( *l > *r )
return 1;
return 0;
}
int main()
{
void *data1 = malloc ( sizeof ( int));
int i = 55;
memcpy ( data1, &i, sizeof(int));
void *data2 = malloc ( sizeof ( int));
int j = 65;
memcpy ( data2, &j, sizeof(int));
compare_int ( data1, data2 );
}
#包括
#包括
#包括
#包括
静态整数
比较整数(空*左,空*右){
int*l=(int*)左;
int*r=(int*)右;
如果(*l<*r)
返回-1;
否则,如果(*l>*r)
返回1;
返回0;
}
int main()
{
void*data1=malloc(sizeof(int));
int i=55;
memcpy(数据1,&i,sizeof(int));
void*data2=malloc(sizeof(int));
int j=65;
memcpy(data2,&j,sizeof(int));
比较_int(数据1、数据2);
}
从以下内容开始:
int main() {
int i = 55;
int j = 65;
printf("%d\n",
compare_int ( &i, &j);
return 0;
}
int compare_int(const void *left, const void *right)
也是一件值得考虑的事情。
< P>我想我明白你在挣扎的是什么。我将把这个问题解释为你为什么int *l = (int*)left;
int *r = (int*)right;
这些线路是必要的
它们是必需的,因为C基本上是汇编语言。当你在C中使用一个类型时,你告诉它你期望这个字段在内存方面有多大。void类型正是一种完全未定义长度的类型。空指针是指向任何类型变量的指针。实际上,任何指针都可以指向任何类型,但是当您取消引用它时,您只能读取该类型的大小
现在,类型void
没有大小。所以不能取消对空指针的引用,因为C在读取值时不知道“在哪里停止”
因此,一个很好的理解它的方法不是int*x
是一个整数指针,而是x
是一个指针,它所指向的数据是一个大小为4字节的整数(或其他)。相比之下,void*y
是一个指针,它指向的数据大小和类型未知
使用强制转换,以便在取消引用指针后知道应该读取的内存大小
另请参见以下说明:
空指针
指针的void类型
是一种特殊类型的指针。在C++中,
void表示缺少类型,
所以void指针是
指向没有类型的值(和
因此,还有一个未确定的长度和长度
未确定的取消引用属性)
这允许空指针指向
任何数据类型,从整数值开始
或者将浮点数转换为字符串。
但作为交换,他们有一个伟大的梦想
限制:他们指出的数据
无法直接取消引用(其中
是合乎逻辑的,因为我们没有类型
解除对的引用),因此
我们将永远不得不投下
指向某个对象的空指针中的地址
指向一个指针的其他指针类型
之前的具体数据类型
取消对它的引用
你怎么能解决这个问题?基本上停止使用
void*
。您的函数被称为compare\u int
,但它理论上接受任何类型并尝试强制转换它。这就是其他评论者/回答者在说“你想在这里做什么?”时的意思,void*
技巧有时非常有用(例如,当你希望能够使用回调函数指针并让程序员传递任何参数时。CreateThread
在windows上的工作方式类似于此),但在这里,只是为了比较两个整数?这太过分了。该函数被称为compare\u int
。比较int。为什么不把它的参数整型?你说“没有得到正确的指针”是什么意思?标准问题:你看到了什么结果?你以为会发生什么?这两种结果有何不同?此代码有什么问题?您的代码没有任何问题。它完全按照您编写的代码执行。你打算让它做什么?这可能与您所写的有所不同。
但我们不知道您的意图,所以我们只能猜测。@Avinash:那你是怎么得出这个结论的?有什么理由反对你吗?我没有反对你,但我怀疑这是因为他一开始就有完美的工作代码。因为最初的海报上写的代码是一个大代码库的片段,此函数可能与
qsort
或相关函数一起使用,用于排序int
数组。为此,原型必须就是这样。因此,我们无法避免这里的void
。