如果减去两个空指针,就会得到指针位置之间的相对距离(至少在我的测试系统上是这样)。我应该使用哪种类型来存储结果,以便它与64位系统兼容?size_t是正确的类型还是长的?
背景:我们需要检查给定的空指针作为双指针使用是否安全。我们过去常常将指针转换为int,并检查下三位是否为零,但是我们当前的编码标准不再允许将指针转换为整数类型。我正在考虑计算空指针和空指针之间的差异,并检查这种差异是否可以被8除。假设空指针总是8字节对齐?
发布于 2016-04-14 07:09:28
来自C11, 6.5.6 Additive operators /9 (我的斜体字):
当两个指针被减去时,两个指针都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。结果的大小是实现定义的,其类型(有符号整数类型)是在
ptrdiff_t头中定义的。
通过这一节,从指针中减去NULL在技术上也是未定义的行为,因为NULL绝不能被视为指向同一个数组的元素的指针,也不能被认为是它之外的元素的指针。指针减法实际上仅限于获取同一数组中两个元素之间的索引差。
因此,您可能需要重新考虑您正在进行的检查,特别是考虑到一个双字节实际上不需要有8个字节长,即使是这样,在标准中也没有要求它在一个8字节的边界上对齐。
我更倾向于在函数的文档中声明传递的值必须是一个有效的double指针,如果函数的用户违反了该约定,那么所有的赌注都会被取消。
发布于 2016-04-14 07:14:54
在C标准中没有定义空指针的减法。指针的减法只有在指针同时指向同一数组,而空指针不能指向任何数组时才会定义,因为不能有带空元素的数组。
很可能是使用gcc或其他兼容的东西,它允许对空指针的算术作为扩展,它将其视为char指针。但是,严格的C编译器不应该允许对空指针进行指针运算。
发布于 2016-04-14 07:09:33
如果减去两个空指针,就会得到指针位置之间的相对距离(至少在我的测试系统上是这样)。
有一条严格的规则可以减去两个指针。C11-第6.5.6节:
当两个指针被减去时,两个指针都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。..。
两个空指针的区别是什么类型?
应该是ptrdiff_t。
..。结果的大小是实现定义的,其类型(有符号整数类型)是在
ptrdiff_t头中定义的。..。
https://stackoverflow.com/questions/36615981
复制相似问题