1

使用 2D 整数数组,一切都很好:

 int **p = new int*[8];
 for (int i = 0; i < 8; i++)
    p[i] = new int[8];
 memset(p, 0, 64 * sizeof(int))

但是使用二维字符数组,我得到一个运行时错误

 char **p = new char*[8];
 for (int i = 0; i < 8; i++)
     p[i] = new char[8];
 memset(p, 0, 64 * sizeof(char));

我的代码有什么问题?

4

2 回答 2

7

我认为两者都可能是错误的,只有第二个在运行时失败。每当您分配一个数组时,new它都会进入堆并返回一个指针。因此,在您的情况下,您有 8 个 X 类型的指针存储在p. 您没有8x8 连续的内存块,而是有 8 个指向 8 个内存块的指针,全部为 size 8*sizeof(X)

解决方案是调用memset每个元素p或分配一个内存块并使用索引数学来模拟多维访问或我可能缺少的其他技巧。

于 2012-05-30T22:53:55.910 回答
-1

如果您的数组没有被动态分配,这将起作用:

memset(p, 0, 8 * 8 * sizeof(char[0][0]));

请注意,现在它正在将数组元素的大小传递给sizeof.

但在你的情况下,解决方案确实是为每个元素调用 memset p

for (int i = 0; i < 8; i++) {
    memset(p[i], 0, sizeof(p[i][0]) * 8);
}

如前所述,另一种解决方案是转换p为一维数组。

于 2015-12-02T16:22:46.003 回答