C语言按已知大小强制转换空指针

C语言按已知大小强制转换空指针,c,pointers,C,Pointers,一个简单的问题,在c语言中,我们能用已知的大小和未知的数据类型来转换void指针吗 考虑这种情况: 函数assertEqual,它应该获取两个指针作为参数,对它们进行解引用并使其值相等。当然,您不能取消对void指针的引用,但如果我知道指针指向的数据大小,该怎么办?我可以创建一些已知大小但未知数据类型的动态指针吗?该函数应该类似于assertEqual(void*预期,void*当前,size\u t size)您可以将参数强制转换为无符号字符*,然后比较第一个大小字节(或者更好地使用memcm

一个简单的问题,在c语言中,我们能用已知的大小和未知的数据类型来转换void指针吗

考虑这种情况:


函数assertEqual,它应该获取两个指针作为参数,对它们进行解引用并使其值相等。当然,您不能取消对void指针的引用,但如果我知道指针指向的数据大小,该怎么办?我可以创建一些已知大小但未知数据类型的动态指针吗?该函数应该类似于assertEqual(void*预期,void*当前,size\u t size)

您可以将参数强制转换为
无符号字符*
,然后比较第一个
大小
字节(或者更好地使用
memcmp
哪个字节可以这样做),但不能保证在给定值有多个表示形式的情况下,它会执行您想要的操作(例如,对于结构中的填充,填充内容的差异可能是无害的,但通过这种方法可以检测到,还有其他情况,例如浮点格式的NaN值,从技术上讲,大多数基本类型都可能发生这种情况)

我可以创建一些已知大小但未知数据类型的动态指针吗

作为一般规则。不。您需要知道类型转换空指针的类型。例如,float和int都有4个字节的大小,但类型不同

但是,如果您有等效类型,则可以将类型转换为等效类型。例如,在某些系统上,int和long都是4字节,并且是等效的

一个简单的问题,在c语言中,我们能用已知的大小和未知的数据类型来转换void指针吗

不可以。每种指针类型都有它所指向的特定类型。这包括
void*
,其引用类型(
void
),是该语言提供的不完整类型。不存在指向未知数据类型的指针,尽管在
void*
中有一个指针类型可以与所有其他对象指针类型相互转换

另一方面,通过指向字符类型的指针(例如,
char*
unsigned char*
)访问任何类型的对象都是有效的,一种方法是通过类型为字符数组的左值进行访问。您可以得到与您所要求的非常类似的结果:

int assertEqual(void* expected, void* current, size_t size) {
    unsigned char (*ep)[size] = expected;
    unsigned char (*cp)[size] = current;
    // ...
}
它使用可变长度数组类型作为指向类型:指针
ep
cp
每个指针指向
size
类型
unsigned char
的元素数组。该数组类型的大小是
size
,因此,例如,您确实会发现
sizeof(*ep)==size
。也就是说,您有一个指向指定大小的对象的指针,通过该指针可以访问该对象的字节

然而,正如其他人已经指出的那样,您所要求的有点毫无意义。如果您只想比较两个字节序列,而不知道它们代表什么类型的对象,那么您可以使用
memcmp()
。另一方面,作为一般的相等性测试,这是不安全的,因为当作为给定类型的对象进行比较时,两个具有不同字节序列的对象仍然可以相等。这是因为允许许多整数类型具有不影响其值的填充位,并且因为浮点表示它们完全依赖于实现


此外,
struct
union
类型可以包含具有未指定且不一定一致的值的填充字节。您无法将复合类型与
=
运算符进行比较,但比较构成此类对象表示的字节数组不一定会产生相同的结果在每个成员的基础上比较对象。

如果要取消引用某个对象,必须选择一个类型。相等仅为“已知”类型定义。函数很可能是“函子”它存在的全部意义在于提供一个特定于类型的比较——这意味着函数确实知道转换到什么类型。去阅读标准函数
b搜索
的工作原理,它应该变得清晰起来。我认为你指的不是指针的大小,而是指向的对象的大小。
memcmp
neVER违背了严格的混叠规则,它定义为做一系列字符比较,但结构填充考虑在函数siz中,所以如果我将通过sisitht的类型,我断言,然后解引用应该是好的。@ PaulPARMA:<代码> sieOS/<代码>产生了<代码>结构> <代码>的总大小,而不是单个字段。它包括任何填充字节。在单个类型中也可以有填充位。不能保证两个对象使用按字节比较时相等,除非它们是字节数组(即字符类型之一)@程序员:抱歉,我总是忘记了65.p7,最后一个项目。“奥拉夫,不要难过,这不会是我第一次记错什么东西,或者是因为C和C++的区别而混淆了(而且char和unchar char可能是一个有效的点)。无论是
float
还是
int
都不能保证大小为4字节。它们可以有任何大小,从1字节开始。这是一个表明相同大小的数据可能不兼容的示例。此外,在绝大多数系统上,float是4字节,而对于大多数32位系统,int是4字节。绝大多数系统没有32 bit
int
。即使它们有32位
int
sizeof(int)
也可以产生
1
(字节)。真的吗?即使int是32b,sizeof也应该产生1B?为什么?