c - 是否所有对象都位于 C 中的同一地址空间中?
问题描述
我正在尝试确定 C 标准是否要求所有地址都位于同一地址空间中。如果我有两个不同类型的对象
double d;
int i;
我不能对它们的地址进行指针运算,因为它们是不同类型的指针。但是,标准说我可以将字符类型指针指向那里,并将获得对象中第一个字节的地址。
char *dp = (char *)&d;
char *ip = (char *)&i;
和那些我可以做指针算术,例如找出它们在内存中的距离,(dp - ip)
. 也就是说,当然,如果双精度和整数位于同一内存中。他们总是在我知道的平台上做,但标准能保证吗?char
或者只有当我的指针实际上指向具有相同类型的东西时才允许指针算术?
解决方案
只有当指针具有相同的类型并且它们指向同一个对象时,才定义指针算术。更具体地说,该标准说:
3 对于减法,下列条件之一应成立:
- 两个操作数都有算术类型;
- 两个操作数都是指向兼容完整对象类型的合格或不合格版本的指针;或者
- 左操作数是指向完整对象类型的指针,右操作数是整数类型。
和:
9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。
(为了解释上述内容,单个对象被视为具有一个元素的数组。)
将指针类型转换为char *
解决第 3 节中的约束,但指向的指针d
不指向i
. 所以你不能减去它们。
推荐阅读
- kubernetes - 使用 helm 指定命名空间
- python - 动态如果布尔值与模块查找
- java - 处理 HicariCP Oracle 连接尝试
- c++ - 静态 constexpr 成员函数在非模板类 C++ 中不可调用
- javascript - 在 mongodb 中按给定值递增所有嵌套值
- java - 无法让 Java 和 C# 通过套接字进行通信
- list - Kotlin - 集合 plus() × plusElement() 的区别
- swift - 执行异步云函数的问题
- reactjs - 用于构建的 React 应用的 App Engine app.yaml 处理程序
- android - 我们可以在底部 Appbar 中实现折叠工具栏的行为吗?