2

よくわからないCコードに出くわしました。以下はコンパイルして正常に実行されます。1)char*をstruct*にキャストできるのはなぜですか?2)void *の代わりにこのイディオムを使用することに利点はありますか?

struct foo
{
    int a;
    int b;
    char *nextPtr;
};

. . .

// This seems wrong
char *charPtr = NULL;

// Why not
//void *structPtr = NULL;

struct foo *fooPtr;
fooPtr = (struct foo*)charPtr;

//文字列部分を削除して編集します。これは、実際には問題のポイントではないためです。

4

3 に答える 3

1
  1. これは言語が提供する柔軟性であるため、ポインタタイプ間で変換できます。ただし、注意して、自分が何をしているか、または問題が発生する可能性があることを知っておく必要があります。

  2. いいえ。変換が不要になるように、プロパティポインタタイプを使用することには利点があります。それが不可能な場合は、void *を使用しても問題ありませんが、コードを読んでいる開発者にとっては少しわかりやすいかもしれません。

于 2012-05-03T18:04:15.540 に答える
1

1)前述のように、Cの任意のポインター型にキャストできます(C ++にはより複雑なルールがある場合がありますが、詳細はわかりません)...

char*2) vsの利点は、でvoid*ポインター演算を実行できるが、では実行できないことchar*ですvoid*

ポインタ演算を実行する際の知恵は、投稿したコードに基づいておそらく疑わしいものですが、可変長の「データ」を持つ構造体では便利なことがよくあります。

于 2012-05-03T19:40:38.297 に答える
0

あなたはちょうどCのそれらの古典的な「両刃の剣」の1つに出くわしていると思います。

実際には、ポインターはポインターであり、アドレスを保持する単なる変数です。理論的には、そのポインタが何かを指すように強制することができます。構造体、整数、a(空欄に記入)。あるものへのポインタを他の何かへのポインタにキャストしようとしても、Cは文句を言いません。それはあなたが何をしているのかを知っていると考えています。あなたがしなければ天国はあなたを助けます:)

実際には、ええ、void *はおそらく、何かの隣を指すことができるポインターを宣言するためのより適切な方法ですが、それが操作に大きな違いをもたらすかどうかはわかりません。ポインタが強く型付けされている場合にコンパイラの最適化などが行われる可能性があるため、その点を誓うことはありません...

于 2012-05-03T18:07:31.080 に答える