memset()如何在C ++中工作

时间:2018-09-03 16:57:20

标签: c++ multidimensional-array memset

我创建了一个布尔2D数组,并像这样使用memset

bool chk[3][3];

memset(chk, 1, 9*sizeof(chk[0]));

我使用以下代码块获得了预期的输出(每行1个)

for(int i = 0 ; i < 3; i++){
    for(int j = 0; j < 3; j++)
        cout<<chk[i][j] <<" ";
    cout<<endl;
}

但是当我尝试操纵数组时,我得到了意外的结果

然后我尝试了

memset(chk, 1, 9*sizeof(chk[0][0]));

这一次一切都很好,并得到了我预期的结果(经过操作)

您能帮我指出出memset()中到底发生了什么吗?

4 个答案:

答案 0 :(得分:4)

第一个代码段中的memset调用存在三个问题:

  1. 尺寸计算不正确。可以使用9*sizeof(chk[0])代替3*sizeof(chk[0])。但是实际上,您应该只使用sizeof(chk),因为您有一个局部变量,而不是指针(如形式参数一样)。

  2. 该标准不能保证true的内存表示形式为位模式1的假设。实际上,它会成立,但是最好直接使用值true而不是不必要的假设。

  3. 在C ++中,只需对变量进行零初始化以使其全部为零,例如bool chk[3][3] = {};,或使用std::fill用给定值(例如, fill( &chk[0][0], &chk[0][0] + 9, true );


附录:要学究,在第1点中,假设bool是1个字节。这也是一个在实践中成立的假设,但标准并不能保证。幸运的是,使用std::fill并不是问题。

答案 1 :(得分:2)

Microsoft.Azure.EventGrid.Models.EventGridEvent event = GetEvent(); dynamic data = event.Data; dynamic itemId = data.itemId; sizeof(chk[0]),显然不同于sizeof(bool[3])sizeof(chk[0][0])

使用sizeof(bool),您可以写到数组memset(chk, 1, 9*sizeof(chk[0]));的边界之外,并获得不确定的行为。

答案 2 :(得分:1)

让我们看看std::memset的文档怎么说:

  

如果count大于dest指向的对象的大小,则行为是不确定的。

在第一个代码中,9*sizeof(chk[0])大于chk的大小,因此程序的行为是不确定的。

memset(chk, 1, sizeof chk)会更简单,并且就大小而言显然是正确的。

答案 3 :(得分:0)

sizeof(array)显然会返回以字节为单位的数组大小。在第一种情况下,您提交给运算符的数组是子数组之一。 C ++中的多维数组不是。它们是数组的一维数组。执行sizeof(chk)来评估整个数组的大小,然后将其除以sizeof(chk[0][0])以获取元素数量。不要使用memset,因为如果会对布尔的二进制表示做一些奇怪的事情,请使用std::fill