c - 正确使用 memset 和动态分配的多维数组

标签 c multidimensional-array memset

在循环的每次迭代中,我希望将动态定义的多维数组中的所有元素归零。

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/

相关文章:

c - 了解 POSIX 和 Linux/glibc sched_* 函数之间的差异

javascript - 将一维数组的元素分组以在 Javascript 中形成锯齿状二维数组

java - 0-1多维背包

c - 使用 memset 和 int 值初始化整数数组 - 失败

c++ - 使用 wmemset() 的代码可移植性如何?

cuda - 是否可以在 CUarray 上运行 cuMemset?

c - 如何使这个函数定时宏在 C 中工作?

c - 多个 fork()。 main怎么知道pid的?

c - 头文件中的全局变量

C++ 并行数组