我正在阅读6.5 Expressions中的C规范
访问其存储值的对象的有效类型是该对象的声明类型(如果有)。如果通过具有非字符类型的左值将值存储到没有声明类型的对象中,则该左值的类型将成为该访问和不修改该访问的后续访问的对象的有效类型。储值。
任何人都可以解释这是什么意思吗?我有一种模糊的感觉,它与指针和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);
}
我收到警告,但对我而言适用。可以保证工作吗?
答案 0 :(得分:6)
当声明给定类型的变量时,它引用该类型的基础对象,因此该对象的有效类型是关联变量的类型。
当malloc
发挥作用时,事情会变得有些模糊。从malloc
返回的内存没有有效的类型。例如:
int *x = malloc(sizeof(int));
假设int
的大小为4个字节,x
现在指向4个字节的没有有效类型的内存。分配给以下对象后,该内存将成为有效类型:
*x = 123;
现在这些字节的有效类型为int
。
在您的示例中,您分配了1000个字节,并且最初这些字节没有有效的类型。
*x = 10;
这使前sizeof(int)
个字节成为int
类型的对象。
struct point *p = x;
此应该进行强制转换,但是最后可以了,因为struct point
的第一个成员的类型为int
,指向结构的指针指向其第一个成员。
p->x = 5;
因此这是安全的,因为&p->x
指向类型为int
的对象,该对象与左值p->x
的类型匹配。
p->y = 10;
这也是安全的,因为&p->y
指向的字节还没有有效的类型,并且赋值导致接下来的sizeof(int)
个字节成为int
类型的对象