c语言中memset函数用法(零基础学C语言内存知识总结)
c语言中memset函数用法(零基础学C语言内存知识总结)
2024-09-27 09:33:15  作者:女騙子  网址:https://m.xinb2b.cn/tech/suh418772.html


memset函数

memset(翻译:清零)是计算机中C/C 语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。

以前说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。

该函数的原型为:

## include <string.h>

void *memset(void *s, int c, unsigned long n);

将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 c 替换并返回 s

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。

memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。如果用 memset 的话反而显得麻烦。

当然,数组也可以直接进行初始化,但 memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。

这时有人会问:“字符串数组不是最好用'\0'进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为'\0'吗?”

可以的。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '\0' 和 0 是等价的,因为字符 '\0' 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 '\0' 的作用,所以通常我们就写“0”。

memset 函数的第三个参数 n 的值一般用 sizeof() 获取,这样比较专业。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof(p),这是新手经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 4。 (网上找别人的)

#include<stdio.h>

#include<string.h>

int main(void) {

int i;

char str[10];

char *p = str;

memset(str, 1, sizeof(str));//参数1就是变量名,中间的1就是指定要初始化的值(可以是任意的值包括字符和浮点数)

//最后那个初始化是长度 (可以是填数字,但没必要)

for (i = 0; i < 10; i ) {

printf("%d\t", str[i]);

}

return 0;

}

根据memset函数的不同,输出结果也不同,分为以下几种情况:

memset(p, 0, sizeof(p)); //地址的大小都是4字节

0 0 0 0 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(p)); //p表示的是一个字符变量, 只有一字节

0 -52 -52 -52 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(str));

0 0 0 0 0 0 0 0 0 0

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

0 0 0 0 0 0 0 0 0 0

memset(p, 0, 10); //直接写10也行, 但不专业

0 0 0 0 0 0 0 0 0 0


calloc函数

有时候,我们在程序中需要一段内存来处理数据,但是又不确定是要多大内存的情况下,比如 我们申请一个数组 a[100] 但是事前我们并不知道会不会用得完这100个元素,比如我们只会用到10个,那么剩下的90个就会还在占用空间,就显得很浪费空间,这时候使用calloc函数是用来在内存的动态存储区中(堆中)分配一个连续存储空间

函数原型:

void* calloc(unsigned int num,unsigned int size)

在内存的动态存储区中分配num个长度为size的连续空间

num:对象个数,size:对象占据的内存字节数,相较于malloc函数,calloc函数会自动将内存初始化为0

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不做初始化,分配到的空间中的数据是随机数据。

注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时建议通过以下方式给出,"长度 * sizeof(数据类型)";并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,就可以int *p = (int *)calloc(20, sizeof(int))这样就省去了人为空间计算的麻烦。

函数返回值:calloc函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

#include<stdio.h>

int main(void) {

int *p = (int *)calloc(10, sizeof(int));

int i;

printf("申请得的空间有:\n");

for (i = 0; i < 10; i ) {

printf("%d ", *p );

}

return 0;

}

结果:

0 0 0 0 0 0 0 0 0 0

//可以看到,使用calloc函数分配时,它最自动赋值零,而下面要介绍的malloc函数则不会

那么会有人有疑问:既然calloc不需要计算空间并且可以直接初始化内存避免错误,那为什么不直接使用calloc函数,那要malloc要什么用呢?

实际上,任何事物都有两面性,有好的一面,必然存在不好的地方。这就是效率。calloc函数由于给每一个空间都要初始化值,那必然效率较malloc要低,并且现实世界,很多情况的空间申请是不需要初始值的,这也就是为什么许多初学者更多的接触malloc函数的原因。

希望对你有帮助!

作者:Mr_Li_

另外的话为了帮助大家,轻松,高效学习C语言/C ,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例,帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦~

编程学习书籍分享:


编程学习视频分享:


整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

对于C/C 感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C 的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

  • 雷佳音大红力捧好哥们尽显真友情(春节档演技大排名)
  • 2024-09-28春节档演技大排名春节档六部电影热度不减,大家看了几部?可以说每一部都可圈可点,的确是近几年质量最高的春节档单论五部电影中演员的表演,就给艺绽君留下深刻印象今天就来做个盘点吧——春节档演技大排名!《深海》和《熊出没·伴。
  • 孕妇吃燕窝的好处与功效有哪些(孕妇吃燕窝的好处与注意事项)
  • 2024-09-28孕妇吃燕窝的好处与注意事项孕妇可以吃燕窝吗答案是肯定的,其实只要保证绝对是无任何添加、纯正天然的燕窝都适合孕妇吃孕妇吃燕窝,可使未来的新生婴儿更强壮、更白皙、更漂亮、更不易生病;产后的妇女吃燕窝,对缓解哺育孩子的劳累,恢复生产。
  • 做梦梦见说谎(做梦梦见说谎是什么意思)
  • 2024-09-28做梦梦见说谎是什么意思现实中,人们为了生存,不得不说一些必要的谎话,来求得别人的认可和满意所以,在梦中,谎言就变成了好消息梦见自己说谎,意味着将会遇到好事梦见陌生人对自己说谎,则意味着发财梦见自己撒谎以求逃脱惩罚,表示你将。
  • 分手多年重逢的虐文(微虐耽美文推荐)
  • 2024-09-28微虐耽美文推荐公子晋阳作者:吴沉水文案:有谁一穿越,身边躺着一个伤痕累累的女人?这个身体到底是何人所有?为什么要靠虐女人才能获得平静?他只不过是一个情场失意,心脏病发作的现代人,竟然就这样来到一个古代世界,顶着一个。
  • cad大样图标注比例(CAD图元尺寸标注规范设定)
  • 2024-09-28CAD图元尺寸标注规范设定标注是每个图档都必备的内容,在CAD中如何设置、使用好标注需要仔细了解也许,标注的好坏直接决定着图档的质量尺寸标注的设定设定方法:1、命令(DDIM),快捷键DT在对话框中找到“修改”,然后找到“直线。
  • 古天乐版倚天屠龙记哪个台播放(新版倚天屠龙记海报公开)
  • 2024-09-28新版倚天屠龙记海报公开由王晶执导的电影《新倚天屠龙记》海报发布,林峯、古天乐、文咏珊、邱意浓、徐锦江等众主创亮相该片改编自金庸同名小说,剧情将延续1993年的电影《倚天屠龙记之魔教教主》,讲述张无忌前往大都寻找赵敏的故事,。
  • facebook怎么暂停使用(Facebook官宣推出清除历史记录功能)
  • 2024-09-28Facebook官宣推出清除历史记录功能编辑心得:Facebook在用户信息管理上做了很大的投入,之前被爆已经删除的不合法内容又重现网页,使得脸书格外重视信息浏览记录方面,正在逐步推出更新应用,满足用户需求,确保信息安全  Facebook。
  • 19年属狗的全年财运(18年生肖属狗的男女运势锦集)
  • 2024-09-2818年生肖属狗的男女运势锦集生肖狗女命今年2018年属于本命年运程最凶,毋容置疑,女命最怕的是本命年破坏福元宫,其次是魁罡破婚,男怕破财女怕破婚,魁罡的破坏力很强,此外还有本命年引发的剑锋煞专门破坏寿元宫,指背小人星出现在禄元宫。
  • 世界上没有路只有想不通的人(世界上本来有路)
  • 2024-09-28世界上本来有路世上本来没有路,走的人多了,也就成了路—鲁迅1.鲁迅先生当时说这句话的时候,由于当时的时代不同,需要更多的有志之士开创新的天地在当今社会下,此名句同样实用,不过我对此有着不同的理解:世上本来有路,走的。
  • 高考试卷难度是不是比以前简单(高考统一试卷和排名)
  • 2024-09-28高考统一试卷和排名我们的人生中参加的每一场考试,都应该力求公平,公正和公开否则我们付出的努力很有可能被其他的事情所掩盖,导致我们的成绩不够透明化,也显示不出我们真正的能力和风采保证考试公平性是一件很重要的事情,越是大型。
  • 新聊斋志异石妖抱胭脂(聊斋志异胭脂)
  • 2024-09-28聊斋志异胭脂东昌府有个姓卞的牛医,生得一个女儿,小名叫做胭脂这胭脂姑娘才貌双全,既聪慧又美丽她的父亲很是珍爱她,想把她许配给清贵的门第,但是那些名家世族却嫌他家出身低贱,不屑于结这门亲,所以胭脂已经长大成人,却还。