2

特定の理由から、構造体へのポインターを逆参照して、構造体の最初のメンバーのみにアクセスしたいと考えています。

これが合法かどうか、または特定の条件下でUBを引き起こす可能性があるかどうかを知りたいです。これに問題がある場合、正しい解決策は何でしょうか。

ありがとうございました。

#include <stdio.h>
#include <stdlib.h>

typedef struct test_s
{
    void * data ;
    struct test_s * next ;

} test_t ;


int main( void )
{
    test_t * t = calloc( 1 , sizeof( test_t ) ) ;

    int n = 123;

    t->data = &n ; //int is used only for an address, this could be anything, an object for example
    void ** v = ( void* )t ;
    printf("Address of  n: %p\nAddress of *t: %p\n\n" , &n , *v ) ; //dereference the pointer to struct to access its first member

return 0;
}
4

2 に答える 2

9

はい、これは合法です。C99、6.7.2.1.13 から:

適切に変換された構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。

于 2013-09-02T14:35:44.420 に答える
4

はい、これは 100% 合法です。C 標準では、 astructへのポインターは常に that の最初のメンバーへのポインターと等しくなければならないと指定されていますstruct

于 2013-09-02T14:31:37.513 に答える