为什么memset不能将数组元素初始化为1

 我来答
冰火使者IAFEnvoy
2020-02-29 · 超过29用户采纳过TA的回答
知道答主
回答量:71
采纳率:80%
帮助的人:14.3万
展开全部

当然不行啦。

memset只有赋值是-1,0是正确的,原因如下:

用memset初始化数组为1出错-CSDN

memset是按字节赋值的,取变量a的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

其他的数字的赋值只能用for:

for(int i=1;i<=n;i++){

z[i]=1;

}

言清韵柯北
2020-01-14 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:35%
帮助的人:696万
展开全部
很简单memset是一个字节一个字节的设置,把一个int的每个字节都设置为1,也就是0x01010101,十进制就是16843009
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
heart阿飞55
2018-04-29 · TA获得超过1086个赞
知道大有可为答主
回答量:3030
采纳率:82%
帮助的人:557万
展开全部
1、效果是一样的,memset更常用。memset的效率比for循环要高出很多。
2、使用memset函数与将函数代码写在自己的程序里是不一样的,C标准库中的memset对Cache的利用做了优化,具体的在《C专家编程》151页有解释,这里给出测试:

#include <string.h>
#define MAXSIZE 100000

int main()
{
char arr[MAXSIZE];
for(int i=0;i<10000;i++)
{
memset(arr,'0',sizeof(arr));
// for(int j=0;j<MAXSIZE;j++)
// arr[0] = '0';
}
return 0;
}

程序里的注释部分与memset行分别使用,结果是使用memset的程序运行时间大约为0.1s,而用for循环的程序要3s多。综上:memset()可以用在字符数组的初始化以及类似于memset(arr,0,n*sizeof(int));的情况,效率比手动赋值要高的多。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式