Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这个代码有什么问题_C - Fatal编程技术网

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