32

voidポインターをキャストした後でも、逆参照中にコンパイルエラーが発生します。誰かがその理由を教えてくれませんか。

int lVNum = 2;
void *lVptr;
lVptr = (int*)&lVNum;

printf("\nlVptr[60 ] is  %d \n",lVptr[1]);
4

7 に答える 7

37

voidポインタを逆参照することは意味がありません。コンパイラは、ポインタが指しているメモリをどのように解釈しますか?最初にポインタを適切な型にキャストする必要があります。

int x = *(int*)lVptr;
于 2013-03-18T01:30:38.643 に答える
30

printf("\nlVptr[60 ] is %d \n", *(int*)lVptr);

これにより、voidポインターがへのポインターにキャストされ、int正しく逆参照されます。

それを(1つの)配列として扱いたい場合は、少し醜いことをすることができます((int *)lVptr)[0]。使用[1]は範囲外であるため、(lVptr[60]...に関しては)良い考えではありません。

于 2013-03-18T01:32:51.257 に答える
5

それはvoid*あなたがそれを宣言したものだからです。どのポインタも暗黙的にに変換される可能性があるvoid*ため、キャストは何も行わず、最初とvoid同じようにポインタが残ります。

として宣言する必要がありますint*

void *some_ptr = /* whatever */;
int *p = (int*)some_ptr;
// now you have a pointer to int cast from a pointer to void

C での戻り値をキャストする必要がない(そしてキャストすべきではない)のと同じ理由で、のキャストint*も不要であることに注意してください。malloc

void*は、他のポインタ型との間で暗黙的に変換できます。わかりやすくするために、ここにキャストを追加しました。コードでは、単純に記述します。

int *p = some_void_ptr;

また、これ:

lVptr[1]

間違っている。2つではなく1つへのポインタがありますint。その逆参照により、未定義の動作が発生します。

于 2013-03-18T01:30:16.533 に答える
4

voidポインターには型がないため、逆参照することはできません。最初にそれをキャストして(int *)lVptrから、逆参照する必要があります*(int *)lVptr

int lVNum = 2;
void *lVptr;
lVptr = &lVNum;

printf("\nlVptr[60 ] is  %d \n",*(int *)lVptr);
于 2014-08-27T15:23:36.380 に答える
1

あなたがやろうとしているかもしれないことの例:

#include <stdio.h>

int main () {
    void *v;
    unsigned long int *i = (unsigned long int *)v;

    *i = 5933016743776703571;

    size_t j = sizeof(i);
    printf("There are %ld bytes in v\n", j);

    size_t k;
    for (k = 0; k < j; k++) {
        printf("Byte %ld of v: %c\n", k, ((char *)v)[k]);
    }
}

出力:

There are 8 bytes in v
Byte 0 of v: S
Byte 1 of v: T
Byte 2 of v: A
Byte 3 of v: C
Byte 4 of v: K
Byte 5 of v: O
Byte 6 of v: V
Byte 7 of v: R
于 2013-03-18T05:34:26.027 に答える
1

voidポインターはまさにそれであり、voidへのポインターです(定義できるものはありません)。

場合によっては便利です。たとえば、malloc()は、未定義の目的でメモリを割り当てたという理由だけでvoidポインタを返します。一部の関数は、場所以外の実際のコンテンツを気にしないため、同様にvoidポインタを引数として取る場合があります。

正直なところ、あなたが投稿したスニペットはまったく意味がなく、あなたが何をしようとしていたかを推測することさえできません。

于 2013-03-18T03:36:43.040 に答える
0

@Code-Guruビジュアルスタジオでコンパイルしてみました。エラーが発生します。式はオブジェクトを完成させるためのポインタである必要があります。

teppicに感謝します。あなたが提案したように、以下はコンパイルして正しい結果をもたらします。

#include<stdio.h>

void main(){

printf("study void pointers \n");

int lvnum = 2;
void *lvptr;
lvptr = &lvnum;
printf("\n lvptr is %d\n",((int *)lvptr)[0]);


}

ただし、printf( "\ n lvptr is%d \ n"、((int *)lVptr)[60]);を試してみると コンパイルして実行しますが、乱数を返します。

たくさんの提案をありがとう、友達。不必要にキャストされたintポインターにvoidポインターを割り当て、逆参照されることを期待していたことをお詫びします。ただし、逆参照したい場合はキャストする必要がありました。

スニペットの目的:私の情報源では、同様の状況によって引き起こされたklocworkエラーを見つけました。それどころか、プログラムはコンパイルされただけでなく、正しい結果をもたらしました。理由-これは低レベルのコード(OSなし)であり、voidポインターに割り当てられたメモリは60程度のカウントまですでに予約されています。しかし、klocworkツールはその制限を持つファイルを解析できず、エラーが発生しました。私はたくさんのブレインストーミングをして、何かばかげたことになりました。

Saurabh

于 2013-03-19T05:01:15.460 に答える