二维字符数组上的 memset

Posted

技术标签:

【中文标题】二维字符数组上的 memset【英文标题】:memset on 2d array of chars 【发布时间】:2012-05-30 22:49:50 【问题描述】:

使用 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));

我的代码有什么问题?

【问题讨论】:

你需要为每个 p[i] 调用 memset。您无法保证它们在内存中是连续的,并且您不会在不应该写的地方写。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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 转换为一维数组。

【讨论】:

以上是关于二维字符数组上的 memset的主要内容,如果未能解决你的问题,请参考以下文章

怎么用memset清空字符数组?

怎么用memset清空字符数组?

二维数组中的 Memset

对二维数组的“memset”的混淆和“free”的错误

将 memset 用于特定行的二维数组

使用 memset 初始化指针元素的二维数组