0

重複の可能性:
void * ポインターを整数に設定する

前の質問は締め切りました。明確に指定していない可能性があります。もう一度質問してもよろしいですか?

私はポインタを持っています:

void * p;
p = malloc(sizeof(int));

次にintがあります:

int age = 20;
p = (void*)age;

私の質問はどのようにp = (void*)age;機能するのですか?p がポインタの場合、(void*) は の前で何をしageますか? なぜ値pが20なのですか?

4

4 に答える 4

3

という自動変数を作成していて、ポインタであるageという変数も作成しています。これは何かへのポインターであることを意味しますが、あなたには何がわかりません。次に、の値をポインタに代入しています。型システムを満たすためには、構文を使用してキャストする必要があり、コンパイラーに「自分が何をしているのか知っている」と伝えます。pvoid *agepvoid *(void *)

整数をポインターに格納する理由については void *...私が考える正当な理由はありません。おそらく、スタック上の変数を指すことp = &ageを意味します。p

ratzip のコメントに答えるには:

`(void *)age`

void *「」の値を持つポインタを意味しますage

私が書いた場合void *p = malloc(1)、それはいくつかのメモリを割り当て、の数値pはメモリ内のアドレスになります12345。メモリ内のその値に移動すると、割り当てたメモリが見つかります。私が書いた場合(void *)age、私はキャストしています(つまり、ある型で値を取得し、別の型に格納しています)、それをに割り当てていpます。の値pは 20 で、p「アドレス 20 のメモリ」を指します。使用したいメモリがそこにあることわかっていない限り、これは無意味です。99.999%の確信を持って、そうではないと言えます。intpointerはどちらも数値ですが、まったく異なる目的で使用されます。1 つはユーザーに対する数値を表し、1 つはコンピューターに対するメモリ アドレスを表します。

(もちろん、仮想化されたメモリでは、上記は厳密には当てはまりません)

于 2012-08-20T13:38:25.850 に答える
1

キャストにより、コンパイラは自分が何をしているのかを知っていると想定し、整数値をageアドレスに変換するコードを発行します。いずれにせよ、アドレスは単なる整数値であるため、これは通常、それほど難しいことではありません。

もちろん、値をアドレスとして使用20することはほとんど意味がないため、ポインターが逆参照されると、このコードはクラッシュを引き起こす可能性があります。

テキスト(void *)は括弧で囲まれた型名です。これは C では「キャスト」と呼ばれ、それに続く式の型を名前付きの型に変換する役割を果たします。通常、正しいコードでキャストがvoid *必要になることはめったにないため、関連するキャストを確認することは警告サインとして機能するはずです。

于 2012-08-20T13:36:11.453 に答える
0

および integer をポインターにキャストしてから、それを入れると、be を指しているアドレスp明示的に指定します。p20

通常、操作するデータの明示的なアドレスがわからないため、プログラム内のポインターを、&演算子または のようなメモリ管理機能を使用して明示的でないアドレスで初期化しますmalloc

ただし、この使用例は、組み込みシステムの世界では非常に一般的です。通常、ハードウェアにはアドレス空間にマップされた一連のレジスタがあり、以下のような構造は非常に一般的です。これらのアドレスはすべて、HW ドキュメントで指定されています。

#define SOME_DEVICE_REG_ADDRESS 0x10050000
...
uint32_t *p = (uint32_t *)SOME_DEVICE_REG_ADDRESS
于 2012-08-20T13:45:00.583 に答える
0

(void*) は型キャストであり、整数値 20 を (void*) 値 20 にキャストしています。

基本的に、malloc() から返された現在の (void*) 値を 0x00000014 に設定しています。

p を age 整数のアドレスに設定しようとしている場合は、次のようにする必要があります。

p = &age;

p が指すメモリー (malloc で割り当てた) に値 20 を入力する場合は、次のようにする必要があります。

*p = age;
于 2012-08-20T13:38:34.090 に答える