我正在阅读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/

10-11 22:50
查看更多