9

我正在尝试在纯二维数组上使用 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:

memset (l, 1, sizeof(l));

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

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

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

http://ideone.com/VFYUDg

请帮忙。

4

3 回答 3

26

memset适用于字节,因此它用 0x01010101 值(假设 int 是 32 位)填充您的整数数组,即十进制 16843009。

如果您需要用数字填充二维 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]

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

于 2013-10-31T13:29:37.620 回答
7

实际上,它工作得很好......

168430090x01010101(hex) 的十进制表示。

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

于 2013-10-31T13:30:43.263 回答
-5

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

int l[3][3] = {1,1,1,1,1,1,1,1,1};

于 2013-10-31T13:45:59.123 回答