0

Apache Web サーバー用のモジュールを構築する際に、構造体の宣言がおよびconst char*の宣言のようにメンバーのみを受け取ると述べているいくつかのインスタンスに遭遇しましたが、mod_security や new関数などのさまざまなモジュールで例を見つけています。データ型がこれらの構造に挿入されていることを示します。apr_table_tapr_array_header_tap_parse_form_datavoid *

私の質問は、これがどのように可能であり、同じ方法を使用しようとすると Visual Studio コンパイラが文句を言うのはなぜですか?

これの良い例はvoid *request_recメモに a を格納する create_request 関数を使用した mod_security です。

4

1 に答える 1

1

ポインターは変換可能であり、すべてのオブジェクト ポインター型は に変換可能です。これは、ポインターを に格納しても情報が失われないvoid*という意味です。void*つまり、次のことが有効です。

struct Foo a;
struct Foo * p = &a;   // p points to a

void * q = p;          // OK, can store the value of p in q

struct Foo * r = q;    // OK too - we can go back, and r points to a

r->n = 1;

したがって、C ではポインタを として渡すのが慣習であり、それらは常にのオブジェクト ポインタ値を保持し、必要な場合にのみ目的の型にキャストし直すことvoid*ができることを知っています。

特にポインターに関する最後の言葉:オブジェクト ポインターをcharキャストchar*、実際に char の配列へのポインターとして逆参照することは、型パニングを構成せ、厳密なエイリアシング規則に違反しません。これにより、基になるオブジェクトにアクセスできるようになります。任意のオブジェクトのバイナリ表現。

于 2012-05-12T23:22:44.310 に答える