-2

このNoobieの質問で申し訳ありませんが、次のコードのいずれかを機能させることができませんか?

スニペット1:

int main(void) {
    void *ptr;
    *ptr = 1;
    printf("%d", *ptr);
    return 0;
}

スニペット2:

int main(void) {
    void *ptr;
    int a = 1;
    ptr = &a;
    printf("%d", *ptr);
    return 0;
}

スニペット3:

int main(void) {
    void *ptr;
    int a = 1;
    (int*)ptr = &a;
    printf("%d", *ptr);
    return 0;
}

何か案が?

4

4 に答える 4

1

Snippet 1
voidポインタを参照解除することはできません。
Snippet 2
同じ間違い。
Snippet 3
*(int*)ptr = &a;必要ありません。ボイドポインタは、あらゆる種類のポインタのアドレスを保持できます。

voidポインタを使用したい場合は、以下のように実行できます
void *p;
int a=5;
int *i_ptr = NULL;
p = &a
i_ptr = p
printf("\n %d",*i_ptr);

ここでは、アドレスをvoidポインターからintegertポインターにコピーしています。ただし、正しい型キャストを行うには、pにintへのポインターのアドレスが含まれていることを確認する必要があります。

于 2012-10-25T09:31:12.767 に答える
1

このようにポインタをその場で型キャストできます(スニペット3)

printf("%d",*(int*)ptr);

3つのスニペットすべてで、voidポインターを逆参照しています。これは標準では許可されていません(または未定義の動作です、私は覚えていません)。

于 2012-10-25T09:32:48.277 に答える
1

Snippet1は意味がありません。あなたは何かを「ボイド」に保存しようとしていますが、それは不可能です。

Snippet 2は理にかなっていますが、「voidへのポインタ」の内容を取得できないため、*ptrは使用できません。代わりに、それをintへのポインターにキャストし、その内容を取得します。 printf("%d", *(int*)ptr);

Snippet 3は意味がなく、型キャストは有効なC構文ではありません。それを除けば、スニペット2と同じ問題があります。

于 2012-10-25T10:47:30.480 に答える
0

間接参照voidポインタはundefined behaviour

これを試してみてください

ptr=(int*)&a;

タイプのポインタを1つ作成しますint

次に、このptrをそれに割り当て、そのポインタを逆参照できます

int *p;
p=ptr;
printf("%d",*p);
于 2012-10-25T09:25:55.940 に答える