我创建了一个布尔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()中到底发生了什么吗?
答案 0 :(得分:4)
第一个代码段中的memset
调用存在三个问题:
尺寸计算不正确。可以使用9*sizeof(chk[0])
代替3*sizeof(chk[0])
。但是实际上,您应该只使用sizeof(chk)
,因为您有一个局部变量,而不是指针(如形式参数一样)。
该标准不能保证true
的内存表示形式为位模式1的假设。实际上,它会成立,但是最好直接使用值true
而不是不必要的假设。
在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
。