首页 > 解决方案 > “有效类型”的解释?

问题描述

我正在阅读 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);
}

我收到警告,但它适用于我的情况。能保证工作吗?

标签: c

解决方案


当您声明给定类型的变量时,它引用该类型的底层对象,因此对象的有效类型是关联变量的类型。

事情变得有点模糊的地方是什么时候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


推荐阅读