C:两个空指针的区别是什么? [英] C: what type is the difference of two void pointers?

查看:10
本文介绍了C:两个空指针的区别是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我减去两个空指针,就可以得到指针位置之间的相对距离(至少在我的测试系统上是这样)。我应该使用什么类型来存储结果,以便它与64位系统兼容?SIZE_T是正确的类型还是可能很长?

背景:我们需要检查给定的空指针用作双指针是否安全。我们曾经将指针强制转换为int,并检查较低的三位是否为零,但我们当前的编码标准不再允许将指针强制转换为整数类型。我正在考虑计算空指针和空指针之间的差异,并检查该差异是否能被8整除。假设空指针始终是8字节对齐的?

推荐答案

来自C11, 6.5.6 Additive operators /9(我的斜体):

当两个指针相减时,两个指针都指向同一数组对象的元素,或者指向数组对象的最后一个元素之后的一个元素;结果是两个数组元素的下标的差异。结果的大小由实现定义,其类型(带符号整数类型)ptrdiff_t<stddef.h>头中定义。

根据该节,从指针中减去NULL在技术上也是未定义的行为,因为NULL绝不能被视为指向同一数组的元素或指向该数组之外的元素的指针。指针减法实际上仅限于获取同一数组中两个元素之间的索引差异。

因此,您可能需要重新考虑您正在进行的检查,特别是考虑到双精度型实际上不需要8个字节的长度,并且即使它是8个字节的长度,标准中也没有要求它必须与8个字节的边界对齐。

我更倾向于在您的函数的文档中声明,传递的值需要是有效的double指针,如果您的函数的用户违反了该约定,则所有赌注都将失败。

这篇关于C:两个空指针的区别是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆