#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
为什么会这样?
任何答案都将受到高度赞赏。提前谢谢。
答案 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)
#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
初始化
使用01
,memset
数组只能使用int
或0
进行初始化,因为-1
和0
都包含所有位{{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[^]。