-2

ポインタが宣言されています

int *v;

そして、2つの関数が呼び出されます。

createMemObjects(M, N, v, context);
transferToDevice(M, v, commands);

したがって、int * pvを渡す最初の関数では、配列を埋めます。

pv = malloc(sizeof(int) * M); 
memset(pv, 0, sizeof(int)*M);

for (int i = 0; i<M; i++) {
        pv[i] = N; //Initialise every element of vector with N.
        printf("Element %d: %d\n", i, pv[i]);
    }   

印刷は、pvがN=2で満たされていることを示しています。

* pvを引数として使用する後の関数では、同様の印刷ループを使用します。

for (int i = 0; i<M; i++) {
        printf("Element %d: %d\n", i, pv[i]);
    }   

そして、2の代わりに、すべての要素が0に戻ることを示しています。何が間違っているのでしょうか。ポインタを正しく使用していることは確かですが、見逃しているものはありますか?

4

1 に答える 1

3

コメントしたように、 Cはポインタを含む値で引数を渡すため、ポインタのアドレスを渡す必要があります。vコードが立っているとき、のコピーv内部に割り当てられてcreateMemObjects()いるため、変更は呼び出し元に表示されません。

/* Invoke as */
createMemObjects(M, N, &v, context);

の引数タイプを:内および内に変更vしますint**createMemObjects()

*pv = malloc(sizeof(int) * M);

でそれぞれを初期化しているので、直後memset()は不要です。malloc()forintpv

于 2012-11-21T14:55:05.727 に答える