【发布时间】:2019-06-24 02:31:21
【问题描述】:
从 c99 的规范中,我不太明白下面分配的对象的有效类型是怎么回事。
typedef struct {
int x;
char y;
} MyStruct ;
MyStruct *make_struct (void) {
MyStruct *p = malloc(sizeof(MyStruct));
p->x = 1;
p->y = 2;
/* what is the effective type of the allocated object at this point? */
return p;
}
当你给一个已分配对象赋值时,分配对象的有效类型变成了用于存储的左值的类型,但是这里使用的左值是什么?
据我了解,从 6.5.2.3p4...
后缀表达式后跟 -> 运算符和标识符指定结构或联合对象的成员。该值是第一个表达式指向的对象的命名成员的值,并且是一个左值。如果第一个表达式是指向限定类型的指针,则结果具有指定成员类型的限定版本。
..."x->y" 表达式的类型是 y 的类型(但仅当 x 指向限定类型时)。
那么我有一个没有有效类型的分配对象和两个类型为 int 和 char 的“内部对象”?
多么令人困惑..
编辑: 假设 *p 的有效类型以 int 结尾。那么这是未定义的行为吗?有人最终会通过 MyStruct 类型的左值访问该对象。访问成员是否也意味着访问聚合类型? 这一直在给..
【问题讨论】:
-
p仍然是指向 MyStruct 类型的指针,x是 int,y是 char,如果这是你要问的。 -
嗯,
*p有一个声明的类型。 -
不,它没有; *p 是一个分配的对象,没有声明的类型。
-
@James:C 标准对对象的有效类型 有特定的规则,而不仅仅是使用什么类型的指针来访问它们。
malloc返回void *的事实在这方面没有提供信息。 -
@James "4 后缀表达式后跟 -> 运算符和标识符指定结构或联合对象的成员。该值是该对象的命名成员的值第一个表达式指向,并且是一个左值。如果第一个表达式是一个指向限定类型的指针,则结果具有指定成员类型的限定版本。"
标签: c struct malloc language-lawyer c99