c语言空指针转为整数的方法,C语言按已知大小强制转换为空指针

博客讨论了在C语言中如何处理void指针,特别是当需要根据已知大小进行转换和比较时。文章指出,虽然不能直接取消引用void指针,但可以通过类型转换和使用memcmp函数比较字节序列。同时,强调了比较未知类型数据的潜在问题,如填充位和浮点表示的不一致性。文章还提到了在某些情况下可以使用可变长度数组类型进行间接访问。
摘要由CSDN通过智能技术生成

一个简单的问题,我们可以用C语言根据未知数据类型按已知大小转换void指针吗?

考虑这种情况:

函数assertEqual,该函数应该获取2个指针作为参数,然后取消引用它们并返回相等的值。 您当然不能取消引用void指针,但是如果我知道指针指向的数据大小该怎么办? 我可以创建一些大小已知但数据类型未知的动态指针吗? 该函数应该看起来像assertEqual(void * Expected,void * current,size_t size)。

如果要取消引用某些内容,则必须选择一种类型。 平等仅针对"已知"类型进行定义。

函数很可能是"函数",其存在的全部目的是提供特定于类型的比较-这意味着函数确实知道要强制转换为哪种类型。 继续阅读标准功能bsearch的工作方式,这应该都清楚了。

我认为您的意思不是指针的大小,而是您指向的对象的大小。

您可以将参数强制转换为unsigned char*,然后比较前一个size字节(或者最好使用memcmp执行此操作),但是不能保证在有多个表示形式的情况下它将按您的意愿进行操作给定值(例如,对于结构中的填充,填充内容的差异可能无害,但可以通过这种方法检测到,还有其他情况,例如用于浮点格式的NaN值,从技术上讲,大多数原始类型都会发生这种情况)。

memcmp从不违反严格的别名规则,它定义为进行一系列字符比较

但是结构填充是在函数sizeof中考虑的,因此如果我要通过我断言的typeof sizeof传递size_t,则取消引用应该可以。

@PavelParma:sizeof产生struct的总大小,而不是单个字段的总大小。它包括任何填充字节。单一类型中也可以有填充位。不能保证两个对象使用逐字节比较来相等,除非它们是字节数组(即字符类型之一)

@AProgrammer:对不起,我总是忘记6.5p7,最后一项。

@Olaf,别难过,这不是我第一次记错某些东西,也不会因为C和C ++之间的差异而感到困惑(char与unsigned char可能是有效的观点)

@AProgrammer:char的异常是imo的遗留问题。在远古时代,mem*函数采用了char *,而char *是"通用指针"。现在,我们使用void *进行此操作,但是为了与旧代码(或不想继续进行的程序员兼容-请参见C90核心程序员的数量)兼容,char和char *仍然具有此例外。

Simple question, can we in c language cast void pointer by known size by unknown data type?

否。每种指针类型都有其指向的特定类型。其中包括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每个都指向类型为unsigned char的size元素的数组。该数组类型的大小为size,因此,例如,您确实会发现该sizeof(*ep) == size。也就是说,您有一个指向指定大小的对象的指针,通过该指针可以访问该对象的字节。

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

此外,struct和union类型可以包含具有未指定且不一定一致的值的填充字节。您不能使用==运算符比较复合类型,但是比较构成此类对象表示形式的字节数组不一定会产生与按成员比较对象相同的结果。

Can I create some dynamic pointer of known size but unknown data type?

作为基本规则。没有。您需要知道用于类型转换void指针的类型。例如float和int的大小均为4个字节,但类型不相同。

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

float和int都不保证具有4个字节的大小。它们的大小可以从1个字节开始。

这是一个示例,说明相同大小的数据可能不兼容。同样,在绝大多数系统上,float是4字节,对于大多数32位系统,int是4字节。

绝大多数系统没有32位int。即使它们具有32位int,sizeof(int)也可以产生1(字节)。

真?即使int是32b,sizeof也应该产生1B?为什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值