私が疑問に思っていたのは、不完全な型の未定義の動作へのポインタへのキャストとポインタからのキャストですか?
struct _obj;
typedef _obj obj;
typedef struct{
int val;
} obj_int;
void print_stuff(obj* o){
printf("%d\n", ((*obj_int)(o)) -> val);
}
私が疑問に思っていたのは、不完全な型の未定義の動作へのポインタへのキャストとポインタからのキャストですか?
struct _obj;
typedef _obj obj;
typedef struct{
int val;
} obj_int;
void print_stuff(obj* o){
printf("%d\n", ((*obj_int)(o)) -> val);
}
いつもの。
標準 6.3.2.3/7:
オブジェクトまたは不完全な型へのポインターは、別のオブジェクトまたは不完全な型へのポインターに変換される場合があります。結果のポインターがポイント先の型に対して正しく配置されていない場合、動作は未定義です。それ以外の場合、再度変換すると、結果は元のポインターと等しくなります。オブジェクトへのポインターが文字型へのポインターに変換されると、結果はオブジェクトの最下位アドレスのバイトを指します。オブジェクトのサイズまで結果を連続的にインクリメントすると、オブジェクトの残りのバイトへのポインタが生成されます。
したがってo
、最初のメンバーが である構造体オブジェクトを指していればint
問題ありません。malloc
の表現int
が書かれているから取得したメモリの先頭を指していれば問題ありません。char[sizeof(int)]
しかし、それが何らかのものを指している場合は、アライメントの問題が発生している可能性があります.