4

我想知道,是否在指向不完整类型未定义行为的指针之间进行转换?

struct _obj;
typedef _obj obj;

typedef struct{
    int val;
} obj_int;

void print_stuff(obj* o){
    printf("%d\n", ((*obj_int)(o)) -> val);
}
4

2 回答 2

6

通常。

标准 6.3.2.3/7:

指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针。如果结果指针未正确对齐指向的类型,则行为未定义。否则,当再次转换回来时,结果将等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。

因此,如果o指向第一个成员是 an 的任何结构对象int,那你就没事了。如果它指向从 获得的内存的开头malloc,那里int已经写入了 an 的表示,那么你很好。但是,如果它指向某个char[sizeof(int)]或某些这样的东西,您可能会遇到对齐问题。

于 2013-08-26T00:32:00.130 回答
1

您提供的信息不足以回答您的问题。如果您将一个obj_int*toobj*然后传递给print_stuff那么您的代码根据 C 标准是合法的,因为您可以将一个指针转换为另一个指针类型并返回。但是,如果 to 的参数print_stuff是通过任何其他方式获得的,那么您将有未定义的行为。

于 2013-08-26T04:00:21.970 回答