memset 初始化问题 (gcc)

本文通过具体实例探讨了memset函数的工作原理及使用限制,特别是在初始化int类型数组时的表现,并给出了只有0和-1两种特殊情况能获得预期结果的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memset相信总是用c的童鞋不会陌生

百度百科给的定义是:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。

原先我总是以为memset是初始化数组的最好方式,比for帅得多,直到最近做了一道题才发现不是这样的。。

比如:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {

int a[5];
int i;
memset(a,2,sizeof(a));
for(i=0;i<5;i++)
{
printf("%d \n",a[i]);
}
return (EXIT_SUCCESS);
}

运行结果;

 
 

 

memset是把每个字节的全部内容替换成2,于是int的4个字节(不同编译器可能不一样)就替换成了

00000010 00000010 00000010 00000010 了,把它换成十进制后就成了2^1+2^9+2^17+2^25

我算数差,只能靠程序了,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char** argv) {

printf("%lf",pow(2,1)+pow(2,9)+pow(2,17)+pow(2,25));
return (EXIT_SUCCESS);
}

运行结果:


而0和-1还是可以用memset的,因为0补完了就是 00000000 00000000 00000000 00000000 还是0

                  -1是 11111111 11111111 11111111 11111111  还是-1

代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {

int a[5],b[5];
int i;
memset(a,-1,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<5;i++)
{
printf("%d %d\n",a[i],b[i]);
}
return (EXIT_SUCCESS);
}

运行结果:

结论:memset在初始化int类型数据时,只能初始化-1和0时才能得到原值,根据定义,它应该是主要初始化字符数组的工具。

转载于:https://www.cnblogs.com/fengyuehan/archive/2012/02/03/memset.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值