内存集不起作用

Memset not working

本文关键字:不起作用 内存      更新时间:2023-10-16

我正在尝试使用以下代码段在纯 2D 数组上使用 memset:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int l[3][3];
    memset (l, 1, sizeof(l));
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << l[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

我希望整个数组使用以下行初始化为 1:

内存集 (l, 1, sizeof(l));

但是我没有得到预期的值,它给了我以下输出:

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

认为这可能是编译器问题,所以我尝试使用 Ideone:

http://ideone.com/VFYUDg

请帮忙。

memset处理

字节,因此它会用十进制16843009的0x01010101值填充整数数组(假设int为32位)。

如果需要用数字填充二维 C 样式数组:

int l[3][3];
std::fill_n(*l, sizeof l / sizeof **l, 1);

*l这里衰减int[3][3]为指向数组第一个元素(int*)的指针,sizeof l / sizeof **l产生数组元素的计数。

它使用C++要求,即数组在内存中连续布局,没有间隙,以便多维数组具有与一维数组相同的布局。 例如 int [3][3]具有与int[3 * 3]相同的布局。

而且,与memset不同,std::fill_n在对象级别操作,而不是在字节级别操作。对于内置类型,优化版本通常作为 SIMD 指令内联,效率不低于 memset .

实际上

,它工作得很好...

168430090x01010101(十六进制)的十进制表示形式。

memset做对了,即它将提供的内存区域中的每个字节初始化为0x01

如果您的目标是将数组的每个项目设置为 1,那么以下内容将完成您的工作,

int l[3][3] = {

1,1,1,1,1,1,1,1,1,1};