c - “有效类型”的解释?
问题描述
我正在阅读 C 规范,该规范在6.5 表达式中说明
访问其存储值的对象的有效类型是对象的声明类型(如果有)。如果通过具有非字符类型类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该类型的后续访问储值。
谁能解释这意味着什么?我有一种模糊的感觉,它与指针和malloc()
,但这是我在没有律师帮助的情况下所能得到的......
根据答案更新:我可以安全地做到这一点吗?
struct point {
int x;
int y;
};
int main() {
int *x = malloc(1000);
*x = 10;
printf("%d\n", *x);
struct point *p = x;
p->x = 5;
p->y = 10;
printf("%d %d\n", p->x, p->y);
}
我收到警告,但它适用于我的情况。能保证工作吗?
解决方案
当您声明给定类型的变量时,它引用该类型的底层对象,因此对象的有效类型是关联变量的类型。
事情变得有点模糊的地方是什么时候malloc
开始发挥作用。返回的内存malloc
没有有效类型。例如:
int *x = malloc(sizeof(int));
假设 anint
大小为 4 字节,x
现在指向 4 字节的内存,没有有效类型。此内存在分配给以下对象时获得有效类型:
*x = 123;
现在这些字节有一个有效的类型int
。
在您的示例中,您分配了 1000 个字节,最初这些字节没有有效类型。
*x = 10;
这使得第一个sizeof(int)
字节成为类型的对象int
。
struct point *p = x;
这应该有一个强制转换,但最后没关系,因为第一个成员struct point
具有 type int
,并且指向 struct 的指针指向它的第一个成员。
p->x = 5;
因此这是安全的,因为&p->x
指向int
与左值类型匹配的类型对象p->x
。
p->y = 10;
这也是安全的,因为 指向的字节&p->y
还没有有效的类型,并且赋值导致下一个sizeof(int)
字节成为 type 的对象int
。
推荐阅读
- amazon-web-services - AWS Lambda 函数通过 RDS 代理连接到 RDS 数据库时超时
- javascript - 导航到 React-data-table-component 中项目的新页面 onClick
- authentication - Ext JS 4.0.7 应用程序的登录屏幕
- ruby-on-rails - 引导程序中的导航栏未打开
- amazon-web-services - 连接到多个 AWS RDS 实例
- kubernetes - 有没有办法回滚编辑的 kubernetes 清单文件?
- liquibase - 使用 liquibase 变更集禁用主键
- python - PyCryptoDome/密码不等式与python中的AES-CFB
- javascript - 从数组javascript更改对象数组中的值
- algorithm - 按长度对数字进行分组的排序算法