-2

指针被声明

int *v;

并调用这两个函数。

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]);
    }   

而不是 2s,它显示所有元素都回到 0。我做错了什么?很确定我一直在正确使用指针,但是我错过了什么吗?

4

1 回答 1

3

正如所评论的,您需要传递指针的地址v,因为 C 按值传递参数,包括指针。正如代码所代表的那样,其中分配了一个副本,因此调用者看不到更改:vcreateMemObjects()

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

更改vtoint**和 within的参数类型createMemObjects()

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

memset()紧随其后的malloc()是多余的,因为for正在初始化每个intin pv

于 2012-11-21T14:55:05.727 回答