“有效类型”的说明?

blu*_*ote 6 c

我正在阅读6.5表达式中规定的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);
}
Run Code Online (Sandbox Code Playgroud)

我收到警告,但对我而言有效。可以保证工作吗?

dbu*_*ush 6

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

事情开始变得有些模糊malloc。从返回的内存malloc没有有效的类型。例如:

int *x = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

假设an int为4字节,x现在指向4字节的内存,没有有效的类型。分配给以下对象时,此内存将成为有效类型:

*x = 123;
Run Code Online (Sandbox Code Playgroud)

现在这些字节的有效类型为int

在您的示例中,您分配了1000个字节,并且最初这些字节没有有效的类型。

*x = 10;
Run Code Online (Sandbox Code Playgroud)

这使第一个sizeof(int)字节成为type的对象int

struct point *p = x;
Run Code Online (Sandbox Code Playgroud)

应该具有强制类型转换,但最后还是可以的,因为的第一个成员struct point具有type int,并且指向struct的指针指向其第一个成员。

p->x = 5;
Run Code Online (Sandbox Code Playgroud)

因此这是安全的,因为&p->x指向的对象类型int与lvalue的类型匹配p->x

p->y = 10;
Run Code Online (Sandbox Code Playgroud)

这也是安全的,因为由指向的字节&p->y还没有有效的类型,并且赋值使下一个sizeof(int)字节成为type的对象int