首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C:两个空指针的区别是什么类型?

C:两个空指针的区别是什么类型?
EN

Stack Overflow用户
提问于 2016-04-14 07:05:34
回答 4查看 2.8K关注 0票数 4

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

背景:我们需要检查给定的空指针作为双指针使用是否安全。我们过去常常将指针转换为int,并检查下三位是否为零,但是我们当前的编码标准不再允许将指针转换为整数类型。我正在考虑计算空指针和空指针之间的差异,并检查这种差异是否可以被8除。假设空指针总是8字节对齐?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-14 07:09:28

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

当两个指针被减去时,两个指针都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。结果的大小是实现定义的,其类型(有符号整数类型)是在ptrdiff_t头中定义的。

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

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

我更倾向于在函数的文档中声明传递的值必须是一个有效的double指针,如果函数的用户违反了该约定,那么所有的赌注都会被取消。

票数 4
EN

Stack Overflow用户

发布于 2016-04-14 07:14:54

在C标准中没有定义空指针的减法。指针的减法只有在指针同时指向同一数组,而空指针不能指向任何数组时才会定义,因为不能有带空元素的数组。

很可能是使用gcc或其他兼容的东西,它允许对空指针的算术作为扩展,它将其视为char指针。但是,严格的C编译器不应该允许对空指针进行指针运算。

票数 7
EN

Stack Overflow用户

发布于 2016-04-14 07:09:33

如果减去两个空指针,就会得到指针位置之间的相对距离(至少在我的测试系统上是这样)。

有一条严格的规则可以减去两个指针。C11-第6.5.6节:

当两个指针被减去时,两个指针都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。..。

两个空指针的区别是什么类型?

应该是ptrdiff_t

..。结果的大小是实现定义的,其类型(有符号整数类型)是在ptrdiff_t头中定义的。..。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36615981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档