c语言中memset函数用法(零基础学C语言内存知识总结)
c语言中memset函数用法(零基础学C语言内存知识总结)
2024-11-22 06:56:44  作者:女騙子  网址: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-11-22古代最雅的文人墨客中国古代文人,大概是历史上最“雅”的群体之一如明代藏书家高濂,仅一间书房就摆满各式高雅趣物,常令来客朋友推门惊叹,只觉琳琅满目,美不胜收且每一样雅物不论大小,皆有来历与讲究,高濂便曾在《遵生八笺》中如。
  • 窝组词(汉字窝怎么组词)
  • 2024-11-22汉字窝怎么组词燕窝[yànwō]也叫燕菜、燕根金丝燕在海边岩石间筑的巢是金丝燕口衔海藻或其他柔软植物纤维后混合着唾液吐出来的胶状物含多种氨基酸及微量元素,营养价值较高,是一种珍贵食品,并可供药用窝头[wōtóu]用。
  • 帕奎奥wba完整(队员或离开俱乐部)
  • 2024-11-22队员或离开俱乐部导语:由于内部问题,ImmortalsCS:GO阵容正处于风雨飘摇的境地在EPL联赛转会期即将结束之际,Immortals三名队员LUCAS1、HEN1、kNgV-决意离开战队他们离队的原因在于同剩下。
  • 矩形薯条怎么做(矩形薯条的做法)
  • 2024-11-22矩形薯条的做法首先将土豆削皮,泡水后切条状,将土豆条泡水防止氧化锅中坐水,水开后放入土豆条焯两分钟,捞出过凉水沥干水分后放入保鲜袋中,放入冰箱冷藏锅中倒油,放入土豆条炸至浅金黄,复炸,炸至表面金黄捞出装盘,配上番茄。
  • 电磁炉线圈加热原理(电磁炉加热原理解析)
  • 2024-11-22电磁炉加热原理解析电磁炉是对于我们生活中息息相关的常用家电厨具之一,每天都要使用来烹饪、蒸煮、炒菜制作各式各样美味但是电磁炉有时候使用不当,亦或者是使用时间比较久后,难免会出现这样那样令人棘手难以解决的问题小编前些日子。
  • 清明荠菜煮鸡蛋的习俗(农历三月三荠菜花煮鸡蛋)
  • 2024-11-22农历三月三荠菜花煮鸡蛋小时候每年清明除了看龙舟赛,外婆会煮荠菜花鸡蛋给我们小孩儿吃说吃的对身体好小朋友也不知道这个是什么东西长大了,知道这个是荠菜花清明节前后荠菜开花了,荠菜花煮鸡蛋有健脾清热的作用所以民间有农历“三月三,。
  • 山行中的斜读什么音什么意思(山行中的斜指什么)
  • 2024-11-22山行中的斜指什么“石径斜”中的“斜”的读音:xiá径:小路的意思出处:“石径斜”出自唐代诗人杜牧写的《山行》里的“远上寒山石径斜”《山行》此诗描绘了秋天景色,展现出一幅动人的山林秋色图,山路、人家、白云、红叶,构成一。
  • 车辆年检尾气为什么会不合格(车辆年检尾气不合格)
  • 2024-11-22车辆年检尾气不合格对于一些有过车辆年检经历的车主而言,在整个车辆检测过程中,最为头疼的一件事就是尾气检测我们都知道,无论是车辆本身的原因,还是平时加注燃油质量的原因,都极有可能导致尾气检测不合格而对于一些年检多次尾气不。
  • 马云谈阿里巴巴员工要什么?马云手下都是奋斗者
  • 2024-11-22马云谈阿里巴巴员工要什么?马云手下都是奋斗者马爸爸三谈996,话说的一次比一次漂亮,鸡汤一碗比一碗更浓郁一边高喊着“企业不能强制996”,一边捧出“向奋斗者致敬”的大旗而且很多人都觉得阿里里面似乎真的都是奋斗者,看看彻夜亮灯的支付宝大楼,看看每。
  • 正宗蚵仔煎的做法窍门(家庭版蚵仔煎做法)
  • 2024-11-22家庭版蚵仔煎做法家庭版“蚵仔煎”做法,嫩滑有营养,孩子爱吃,做法也简单鸡蛋是我们日常做菜时,买的最多的一种食材了,它与很多菜都很百搭,与韭菜一起可以做成韭菜炒鸡蛋,与紫菜一起可以做成紫菜蛋汤与面粉一起可以做成戚风蛋糕。
  • 秀山有什么旅游景点(没去过这两个地方)
  • 2024-11-22没去过这两个地方一说到秋天不少人想到的是桂花、菊花其实,在秀山赏银杏才是秋天的必做功课银杏,为银杏科、银杏属落叶乔木4月开花,10月成熟银杏树生长较慢,寿命极长,自然条件下从栽种到结银杏果要二十多年,四十年后才能大量。
  • 救助金申请成功宁夏(这些人可申领临时救助金)
  • 2024-11-22这些人可申领临时救助金  宁夏新闻网讯(记者闫文丽)2月6日,宁夏民政厅等4部门联合印发了《关于进一步做好最低生活保障等社会救助兜底保障工作的通知》(以下简称《通知》),明确要求全区各级有关部门及时将符合条件的困难群众纳入。