gpt4 book ai didi

c - 这段代码有什么问题

转载 作者:行者123 更新时间:2023-11-30 14:28:48 26 4
gpt4 key购买 nike

这是一段大型代码。我想了解为什么compare_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*)left;
int *r = (int*)right;

这些行是必需的。

它们是必要的,因为 C 基本上是汇编。当您在 C 中使用类型时,您是在告诉它您期望该字段在内存方面有多大。 void 类型正是这样——一种完全未定义长度的类型。 void 指针是指向任意类型变量的指针。实际上,任何指针都可以指向任何类型,但是当您取消引用它时,您只能读取该类型的大小。

现在类型 void 没有大小。所以你不能取消引用 void 指针,因为 C 在读取值时不知道“在哪里停止”。

因此,一个好的理解方式不是 int* x 是一个整数指针,而是 x 是一个指针,并且它指向的数据是一个大小的 int 4 个字节(或其他)。相比之下,void* y 是一个指针,它指向的数据的大小和类型未知。

使用强制转换,以便您知道在取消引用指针后应该读取的内存大小。

另请参阅 cplusplus.com 的解释:

void pointers

The void type of pointer is a special type of pointer. In C++, void represents the absence of type, so void pointers are pointers that point to a value that has no type (and thus also an undetermined length and undetermined dereference properties).

This allows void pointers to point to any data type, from an integer value or a float to a string of characters. But in exchange they have a great limitation: the data pointed by them cannot be directly dereferenced (which is logical, since we have no type to dereference to), and for that reason we will always have to cast the address in the void pointer to some other pointer type that points to a concrete data type before dereferencing it.

你如何解决这个问题?基本上停止使用 void*。您的函数称为compare_int,但理论上它接受任何类型并尝试对其进行强制转换。这就是其他评论者/回答者说“你想在这里做什么?”时的意思。 void* 技巧有时非常有用(例如,当您希望能够使用回调函数指针并让程序员传递任何参数时。CreateThread 在 Windows 上的工作方式类似于this)但是在这里,只是为了比较两个整数?这太过分了。

关于c - 这段代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com