使用2D数组的整数,一切都很好:
int **p = new int*[8];
for (int i = 0; i < 8; i++)
p[i] = new int[8];
memset(p, 0, 64 * sizeof(int))
但是对于2D数组的字符,我得到一个运行时错误
char **p = new char*[8];
for (int i = 0; i < 8; i++)
p[i] = new char[8];
memset(p, 0, 64 * sizeof(char));
我的代码出了什么问题?
答案 0 :(得分:6)
我认为两者都可能是错的,只有第二个在运行时失败。无论何时使用new
分配数组,它都会在堆上运行并返回一个指针。因此,在您的情况下,p
中有8个类型为X的指针。你不有一个8x8的连续内存块,而是指向8块内存的8个指针,大小都是8*sizeof(X)
。
解决方案是为memset
中的每个元素调用p
或分配一个内存块并使用索引数学来模拟多维访问或我可能缺少的其他技巧。
答案 1 :(得分:-1)
如果您的数组尚未动态分配,这将有效:
memset(p, 0, 8 * 8 * sizeof(char[0][0]));
请注意,现在它将数组元素的大小传递给sizeof
。
但在你的情况下,解决方案确实是为p
中的每个元素调用memset:
for (int i = 0; i < 8; i++) {
memset(p[i], 0, sizeof(p[i][0]) * 8);
}
如前所述,另一种解决方案是在一维数组中转换p
。