C语言//////////////

#include<stdio.h>
#include<string.h>
int main()
{
int a[4][5];
memset(a,100,sizeof(a));
for(int i=0;i<4;i++)for(int j=0;j<5;j++)printf("%d\n",a[i][j]);
}
为什么输出这个?
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900

第一:memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
第二:memset(void *s, int ch,size_tn);中key实际范围应该在0~~255,因为该函数只能取ch的后八位赋值给你所输入的范围的每个字节,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111),所以数组中每个字节,如a[0]含四个字节都被赋值为(11111111),其结果为a[0](11111111 11111111 11111111 11111111),及a[0]=-1,因此无论ch多大只有后八位二进制有效,而八位二进制[2] 的范围(0~255)YKQ改。而对字符数组操作时则取后八位赋值给字符数组,其八位值作为ASCII[3] 码。
所以这个4字节的100的后一个字节是 0110 0100
把一个int 4个字节的全初始化为0110 0100
那最后就是 0110 0100 0110 0100 0110 0100 0110 0100 4个字节32比特 转为十进制就是 1684300900
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-03-16
没错啊!以a[0][0]为例:a是int型,所以有4个字节,memset把100放进了这4个字节,就是说每个字节是100。100的二进制是01100100,4个01100100就是01100100 01100100 01100100 01100100,这个数刚好是1684300900的补码。
第2个回答  2020-01-13
相似回答