memset函数的使用及误区

发布于:2023-01-14 ⋅ 阅读:(668) ⋅ 点赞:(0)

memset函数的使用就是将一块内存初始化,函数原型如下(VSstudio2022)

头文件是:string.h

_Dst:是个通用指针,指向你要初始化的那块内存的开头

_Val:是你要将该块内存初始化设定的值,

_Size:长度,我的理解就是,你要将_Val这个值,在这段内存赋几遍

应用场景:

1)将一个字符数组快速初始化

#include<stdio.h>
#include<string.h>

int main() {
	char array[10];
	memset(array, 'd', sizeof(array));
//sizeof(array)是因为我想把array数组全部赋值为'd',当然就把长度设定至能覆盖整个数组的喽
for (int i = 0; i < 10; i++)
	{
		printf("%c\t", array[i]);//\t是制表符
	}
	return 0;
}

 2)将一个整型数组初始化(我遇到的问题来了)

#include<stdio.h>
#include<string.h>
int main() 
{
	int b[10];//创建一个能放10个int的数组
	memset(b, 1, sizeof(b));//本意是想把数组每一个元素的值全部初始化为1
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", b[i]);
	}
}

 

这什么鬼???我刚开始也没整明白,后面去查了下,诶嘿,memset函数是按照字节对内存块进行初始化的!然后我去查了下16843009的二进制:00000001 00000001 00000001 00000001

,每个array[1],array[2]...array[10]存的都是00000001 00000001 00000001 00000001,what?

a)其实我不管你调用我这个memset函数干什么,我memset就做这件事:以这个_Val,在一块内存当中,依次以一个字节为单位,把这个_Val放进每一个单位,要放多少个单位?size个 。效果如下图

但你存归存,你放到数组拿出来调用打印,是另一回事,int array[10],array[0]是4个字节啊,这不就是说你的array[0],其实占00000001000000010000000100000001(十进制就是16843009),所以原因综上喽,你怎么存是一回事,你怎么调用又是另一回事了

b)此外,还有一个值得关注的点,你会发现上面我说的有点错误(1是int型的

,不应该是00...000(31个0)1吗?怎么存的是00000001呢?),因为memset函数的参数int _Val,实际上你传的是int,但是他在执行的时候,只会取位数最低的那8位,比如上面那个1在计算机存的是00...000(31个0)1,他只取00000001(因为这样刚好就是8个位,一个字节了),并将这个二进制数(刚好一个字节)存它个size个

#include<stdio.h>
#include<string.h>
int main() 
{
	int b[10];//创建一个能放10个int的数组
	memset(b, 511, sizeof(b));
	//511的二进制是00000000 00000000 00000001 11111111
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", b[i]);
	}
}

只取最后八位即11111111 ,并将这个存他个sizeof(b)也就是40个

取每四个字节也就是11111...111(32个1),也就是-1(因为存的都是数的补码,-1的补码是1111...1111(32个1))

结果如图 


网站公告

今日签到

点亮在社区的每一天
去签到