我正在阅读C规范,该规范在6.5 Expressions中声明
谁能解释这是什么意思?我有一种模糊的感觉,它与指针和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));
假设
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
类型的对象。关于c - “effective type”的解释?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56690644/