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

2 c++ memset multidimensional-array

我创建了一个布尔二维数组并memset像这样使用:

bool chk[3][3];

memset(chk, 1, 9*sizeof(chk[0]));
Run Code Online (Sandbox Code Playgroud)

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

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

但是当我尝试操作数组时,我得到了意想不到的结果

然后我尝试了

memset(chk, 1, 9*sizeof(chk[0][0]));
Run Code Online (Sandbox Code Playgroud)

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

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

Che*_*Alf 5

第一个代码片段中的调用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 点中假设 abool是 1 个字节。这也是一个在实践中成立但不受标准保证的假设。幸运的是,这对于使用来说不是问题std::fill