c++ 如何正确创建指向2D数组的指针

bvjveswy  于 2023-05-13  发布在  其他
关注(0)|答案(2)|浏览(100)

我已经创建了一个2D数组,它意味着[256][16],并希望创建一个指针将其传递给CUDA内核:

int result[matrix_rows * matrix_cols][16];
 int (*h_result)[16] = result; //host pointer
 int(*d_result)[16]; //device pointer
 
//memory allocation 
CHECK_CUDA_ERROR(cudaMalloc((void**)&d_result, matrix_rows * matrix_cols * sizeof(int)));
    
kernel << <grid, block >> > (d_flat_array, d_result);

但是当我将内核中的值复制到d_result时,它只填充了256个假定元素中的13个,索引是正确的。
我试着调试,但没有发现索引的问题,但[13]之后的所有数组都是null。问题可能出在数组和指向它的指针的分配上吗?

j13ufse2

j13ufse21#

如何正确创建指向2D数组的指针
有两种方法可以做到这一点,如下所示:

方法一

在现代C++中使用decltype

//                      v---------->note the & operator
decltype(&result) ptr = &result;
方法二

使用auto占位符类型:

auto* ptr = &result;
方法三

正确的语法如下所示。还要注意右手边的&,它用于获取2D数组的地址:

int (*ptr)[matrix_rows * matrix_cols][16] = &result;

正如您所看到的,方法1和方法2比方法3更易读。

zxlwwiss

zxlwwiss2#

我总是用这样的方法来创建一个2D数组的指针:

int** a;
a = new int*[First]
for(int i=0; i<First; ++i){
    a[i] = new int[Second];
}

然后你应该有一个二维数组与[第一][第二]元素。用后别忘了把它们洗一洗

相关问题