无法改变我的指针参考

时间:2017-11-01 00:14:24

标签: c pointers

我想声明一个指针,将它传递给一个函数并使用该函数为该指针分配内存空间并稍后使用。

有人可以帮我找出错误的地方吗?

int main()
{
    float * hostdata=NULL;

    int size = 10;
    randgen(&hostdata, size);
    /* Show result */
    for (int i = 0; i < size; i++) {
        printf("%1.4f ", hostdata[i]);// here goes wrong, i got a exception here.
    }
    free(hostdata);

    return 0;
}

int randgen(float ** host_Data,int size_n) {
    size_t n = size_n;
    size_t i;

    float * hostData = *host_Data;// **I went wrong at this line, i just tell system that , declare a float pointer and it's value is the same value as host_data ,  nothing more. so , hostdata in main function still remain NULL.**

    curandGenerator_t gen;
    float *devData;
    /* Allocate n floats on host */
    hostData = (float *)calloc(n, sizeof(float)); 
   /* Allocate n floats on device */
    CUDA_CALL(cudaMalloc((void **)&devData, n * sizeof(float))); 
   /* Create pseudo-random number generator */ 
    CURAND_CALL(curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT));
   /* Set seed */ 
    CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen, 1234ULL));
   /* Generate n floats on device */
    CURAND_CALL(curandGenerateUniform(gen, devData, n)); 
   /* Copy device memory to host */ 
   CUDA_CALL(cudaMemcpy(hostData, devData, n * sizeof(float), 
  cudaMemcpyDeviceToHost)); 

    /* Cleanup */
    CURAND_CALL(curandDestroyGenerator(gen));
    CUDA_CALL(cudaFree(devData));

    return EXIT_SUCCESS;
}

3 个答案:

答案 0 :(得分:0)

我要改变

hostData = (float *)calloc(n, sizeof(float)); 

*host_Data = (float *)calloc(n, sizeof(float)); 

CUDA_CALL也是如此

答案 1 :(得分:0)

如果您希望更新main中的hostdata,则需要执行

 *host_Data = (float *)calloc(n, sizeof(float)); 
 hostData = *host_Data;

答案 2 :(得分:0)

就像其他人说过的那样,你应该改变:

hostData = (float *)calloc(n, sizeof(float)); 

为:

*host_Data = (float *)calloc(n, sizeof(float));

这个的原因是基于内存在C语言中工作的方式。函数的每个实例都为它的变量赋予它自己的堆栈,一旦函数的实例完成就会被垃圾收集。这意味着保存在randgen变量中的任何值都将在最后删除。您将原始hostdata变量的地址从main函数传递到randgen函数host_data,以便您可以更改main hostdata变量中的数据堆。由于main中的hostdata等于NULL,因此将hostData设置为*host_data,这相当于说“转到存储在host_data中的地址并获取该值,将其保存在hostData“中,使其也等于NULL。然后,当您将calloc的返回值赋给hostData时,您将该值保存在函数的堆栈上,然后在函数完成后将其删除。另一方面,当您将calloc的返回值分配给*host_data时,您说“转到host_data中存储的地址,即hostdata的地址,并保存那里的值,所以现在您可以访问主函数中的calloced内存。