0

オンラインで見つけられないように思われる簡単な質問があります。

GPU の作業を行うために CUDA を使用していますが、GPU にデータを割り当てる必要があります。cudaMalloc 関数は次のようになります。

cudaMalloc(void** identifier, size_t space);

簡単です。それでは、整数を割り当てましょう。

int i = 5;
cudaMalloc((void**)&(&i), sizeof(int));

しかし、このエラー (「式は左辺値または関数指定子でなければなりません」)。明らかな回避策は、最初にポインターとして宣言iし、次にそのアドレスを取得することです。これは完全に正常に機能します。私は回避策が嫌いです。

この質問には明らかな答えが必要だと思います-結局のところ、 、**さらに*************Cでうまく機能します.では、変数のアドレスのアドレスを「きれいに」取得するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

5

これは回避策ではありません。それが正しい方法です。

この関数は、 へのポインターのアドレスを必要とします。これは、そのポインターを、割り当てたばかりintの を指すように設定するためです。intしたがって、実際に割り当てられたポインターのアドレスが必要です。"&&i" のような式は、コンパイラーに i のアドレス (格納場所のない純粋な数値) を提供するように要求し、その値へのポインターを提供しますが、もちろんそれはできません。

だからあなたは言いたい

int *p;
cudaMalloc((void**)&p, sizeof(int));

これ*pint割り当てられた です。

于 2012-06-12T02:06:00.343 に答える
1

アドレスのアドレスを取ることはできません。オブジェクトだけがアドレスを持ち、アドレスはオブジェクトではありません。アドレスをポインター (オブジェクト) に割り当ててから、そのポインターのアドレスを取得できます。これは、「回避策」として説明するものです。

于 2012-06-12T02:10:01.930 に答える
0

どこにも保存されていないため、参照への参照を取得でき&iません。存在しないため、そのメモリ位置にアクセスできません。

intへのポインタを使用する必要があります。

int *i = calloc(sizeof(int),1);

その参照は、どこかに格納されているポインター変数のアドレスになります。もちろん、スタックに割り当てるため、ポインターがスコープ外でも有効である必要がある場合は、ローカルスコープでは実行できません。

于 2012-06-12T02:07:43.283 に答える