memset()函数用于字符型、整型数组的初始化详解

在开始介绍memset()函数前,我们需要知道char类型和int类型的相互关系。

  • char是一种字符类型,用来表示单个字符。每个字符占用一个字节的内存空间。
  • int是一种整数类型,用来表示整数。每个整数占用四个字节的内存空间。
  • char类型实际上是一种特殊的整数类型(但所占内存更小,数据范围更小),它可以通过ASCII码与整数联系,例如:
char ch1 = 65;      //A的ASCII码为65(十进制数)
printf("%c",ch1);   //输出为A

char ch2 = 'B';     //B的ASCII码为66
printf("%d",ch2);   //输出为66

int num = 65;      
printf("%c",num);   //输出为A

输出表明,int型的数据能够以字符的格式输出,且该int型的数据恰好是输出字符的ASCII码。

memset()函数说明

//头文件
#include<string.h> //c中
#include<cstring>  //c++中

//声明
void *memset(void *str, int c, size_t n)

解释:从地址str开始,将n个字节长度的内存全部赋值为c(注意是每一个字节都赋值为c)。根据前文的分析,我们可以视c等于所赋字符的十进制ASCII码。即认为 c 是字符类型。

该函数的一般使用方法如下(在本例中,证明了c能够被视为字符类型):

#include <stdio.h>
#include <string.h>
 
int main (){
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,36,7);
/*
'$'的ASCII码为36
该语句的作用是:把字符数组str中的前7个字符都赋值为'$'
该语句也可以写为:memset(str,'$',7);
*/
   puts(str);
   
   return(0);
}

运行以上程序,得到以下结果:

This is string.h library function
$$$$$$$ string.h library function

memset函数用于数组初始化

1.字符串数组初始化

一般来说,字符串数组的初始化,就是让字符串数组为空。

memset(str,'/0',sizeof(str));

2.int型数组初始化

需要注意的是:memset赋值时是按字节赋值。因此用memset函数对int型数组初始化时,可能会造成赋值错误。
例如对于int型数组a,我们尝试使用memset将数组中的元素都赋值为100,即:

int main(){
	int a[3];
	memset(a,100,sizeof a);
	printf("%d",a[0]);
	//输出结果为1684300900
	return 0;
}

输出结果为1684300900,这与我们希望得到的结果截然不同。接下来我们将分析该结果产生的原因:

  • 100表示:内存中每个字节都赋予ASCII码为100的字符。我们将十进制数100转化为十六进制,得到0x64(0x为十六进制前缀)。则 memset(a,100,sizeof a) 表示:将目标内存中的每个字节都赋为0x64
    在这里插入图片描述
  • 如上图所示,由于aint型数组,每个元素占四个字节的内存空间。由于每个字节都被赋值为0x64,因此每个int型元素的值都为0x64646464。将其转化为十进制,得到输出结果1684300900

那么,memset函数是否不适用于所有int型数组的初始化?显然不是。在实际运用中,我们一般使用memset函数初始化int型数组为0、-1或无穷大,分析如下:

memset(a,-1,sizeof(a)); 
//-1的十六进制为0xff,则每个数组元素赋值为0xffffffff,即十进制 -1

memset(a,0,sizeof(a));   
//-1的十六进制为0x00,则每个数组元素赋值为0x00000000,即十进制 0

memset(a,0x3f,sizeof(a)); 
//-1的十六进制为 0x3f,则每个数组元素赋值为0x3f3f3f3f,即十进制1061109567,数量级为10^9,与0x7fffffff一个量级。而0x7fffffff是int类型的最大值,即2^31-1=2147483647 
//因此0x3f3f3f3f可以近似认为是int类型的无穷大 
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值