【发布时间】:2018-09-03 16:57:19
【问题描述】:
我创建了一个布尔二维数组并像这样使用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() 中到底发生了什么吗?
【问题讨论】:
-
sizeof(chk[0]) == sizeof(bool[3]) == 3*sizeof(bool)。您的程序通过缓冲区溢出表现出未定义的行为。 -
您系统上的
bool有多大? -
如果你确定你总是有一个真正的数组(而不是一个指向动态分配内存的指针),最安全的选择是简单地使用
sizeof(chk)。显然,使用文字9很容易导致数组尺寸发生变化(这个问题与类型无关,因此sizeof(chk[0])中的大小不匹配)。 -
memset不是最好的工具,因为每个bool的每个字节都将设置为一个。修复大小问题并使用int尝试此操作,您会看到输出类似于 16843009 而不是 1。您可以使用 bool 解决它,因为所有不是 0 的东西都是正确的,但是您做了很多次工作 -
@Swordfish 因为他不应该使用 memset,除非将它设置为 0,在这种情况下他应该使用值初始化。所以他需要数组的大小,而不是数组使用的存储大小。硬编码数组大小正在招致糟糕的一天发生
标签: c++ multidimensional-array memset