为什么memset不能分配1?

时间:2016-03-07 08:26:06

标签: c++ c memset

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int color[1001][1001];

int main() {
    int i, j;
    memset(color, 1, sizeof(color[0][0]) * 2 * 2);
    for(i = 0; i < 4; i++) {
        for(j = 0; j < 4; j++) {
            printf("%d ", color[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    return 0;
}

输出:

16843009 16843009 16843009 16843009 
0 0 0 0 
0 0 0 0 
0 0 0 0 

为什么不分配1?为什么不打印1而不是16843009?如何分配整数1?

但如果我写memset(color, 0, sizeof(color[0][0]) * 2 * 2);那么输出:

0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 

为什么会这样?

任何答案都将受到高度赞赏。提前谢谢。

4 个答案:

答案 0 :(得分:13)

因为memset每个字节设置为1

因此,如果int是四个字节(32位,最常见的是),那么您将每个元素设置为0x01010101

了解更多in this memset reference page

对于更多C ++ - ish解决方案,我建议使用std::fill

std::fill(&color[0][0], &color[0][0] + sizeof(color) / sizeof(color[0][0]), 1);

这会将所有元素设置为1

第三种选择是改为使用std::array及其fill成员函数:

std::array<std::array<int, 1001>, 1001> color;
...
for (auto& inner : color)
{
    inner.fill(1);
}

答案 1 :(得分:10)

Manpage

#include <string.h>
void *memset(void *s, int c, size_t n)
     

memset()函数使用常量字节n填充{{1>} s指向的内存区域的第一个c字节。

因此,memset不能用于使用int初始化1数组,因为如果int由4个字节表示,那么它将使用{初始化每个字节{1}}。
1相当于16843009。 4个字节中的每一个都用0x01010101初始化 使用01memset数组只能使用int0进行初始化,因为-10都包含所有位{{1}无论-1数据类型的大小如何,分别在二进制补码二进制表示中和0

答案 2 :(得分:6)

memset()会将指定值写入范围内的每个字节,因此,如果int为4字节长,则值为0x01010101,不是1

要指定整数1,请指定整数1。

for (i = 0; i < (int)(sizeof(color)/sizeof(*color)); i++) {
    for (j = 0; j < (int)(sizeof(color[i])/sizeof(*color[i])); j++) {
        color[i][j] = 1;
    }
}

答案 3 :(得分:2)

memset()将您的内存设置为8位与您选择的值对齐,即1。但对于您的数组color[][],您声明了32位数据类型int,它有四个字节。那么memset()做的是将这四个字节中的每一个设置为值1

这也解释了您的结果:16843009d = 0x01010101

如果你看看你的记忆:

memset()1

//.color[0][0].||..color[0][1]...||..color[0][2]...||..color[0][3]..
01  01  01  01    01  01  01  01    01  01  01  01    01  01  01  01
//.color[1][0].||..color[1][1]...||..color[1][2]...||..color[1][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00
//.color[2][0].||..color[2][1]...||..color[2][2]...||..color[2][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00 
//.color[3][0].||..color[3][1]...||..color[3][2]...||..color[3][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00 

memset()0

//.color[0][0].||..color[0][1]...||..color[0][2]...||..color[0][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00
//.color[1][0].||..color[1][1]...||..color[1][2]...||..color[1][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00
//.color[2][0].||..color[2][1]...||..color[2][2]...||..color[2][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00 
//.color[3][0].||..color[3][1]...||..color[3][2]...||..color[3][3]..
00  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00 

如果您使用值memset()致电0,则会获得32位int value = 0x00000000 = 0d

注意:

如果要将整个数组设置为值,请使用以下行:

memset(color, 1, sizeof(color));

然后你的数组看起来如下:

1010101 1010101 1010101 1010101 
1010101 1010101 1010101 1010101 
1010101 1010101 1010101 1010101 
1010101 1010101 1010101 1010101 

查看代码here[^]