在循环的每次迭代中,我希望将动态定义的多维数组中的所有元素归零。
void my_function(int window_size, int row_size){
double **window_arr;
window_arr = (double **)calloc((window_size * 2), sizeof(double*));
for (i = 0; i < (window_size * 2); ++i){
window_arr[i] = (double*)calloc(3, sizeof(double));
}
for (i = 0; i < row_size; ++i){
...
memset(window_arr, 0, sizeof(window_arr) * (window_size * 2) * 3);
}
}
此段错误。在第一个 memset
之前设置断点,但分配后,看起来不错。
(gdb) p window_arr[1]
$1 = (double *) 0x22604f50
(gdb) p window_arr[1][0]
$2 = 0
(gdb) q
memset
之后的断点
(gdb) p snp_window_arr[1]
$1 = (double *) 0x0
(gdb) p window_arr[1][0]
Cannot access memory at address 0x0
(gdb) q
我已经弄清楚如何将 memset 用于一维数组;我真的很想学习如何在上述场景中使用 memset。
最佳答案
您正在构建一个指向数组的指针数组,而不是单个二维数组。这意味着您有一个指针数组,每个指针都指向一个一维数组。然后您尝试 memset()
整个 2D 空间,但这是不可能的,因为它不是连续分配的。
您应该考虑一次性为所有元素分配一个空间,因为您的逻辑二维数组无论如何都是矩形的。只需这样做:
double *window_arr = calloc((window_size * 2) * 3, sizeof(double));
然后:
memset(window_arr, 0, (window_size * 2) * 3);
当然,您将将此二维数组索引为 window_arr[x*window_size*2 + y]
或类似的索引,而不是 window_arr[x][y]
.
关于c - 正确使用 memset 和动态分配的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26643424/