[ZZ]calloc(), malloc(), realloc(), free(),alloca()

2023-10-28 16:08

本文主要是介绍[ZZ]calloc(), malloc(), realloc(), free(),alloca(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内存区域可以分为栈、堆、静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的。

利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。

四个函数之间的有区别,也有联系,我们应该学会把握这种关系,从而编出精炼而高效的程序。

在说明它们具体含义之前,先简单从字面上加以认识,前3个函数有个共同的特点,就是都带有字符”alloc”,就是”allocate”,”分配”的意思,也就是给对象分配足够的内存,” calloc()”是”分配内存给多个对象”,” malloc()”是”分配内存给一个对象”,”realloc()”是”重新分配内存”之意。”free()”就比较简单了,”释放”的意思,就是把之前所分配的内存空间给释放出来。

大家可以参照这篇文章:http://swoolley.org/man.cgi/3/malloc

 

void *calloc(size_t nobj, size_t size);

分配足够的内存给nobj个大小为size的对象组成的数组, 并返回指向所分配区域的第一个字节的指针;

若内存不够,则返回NULL. 该空间的初始化大小为0字节.

char *p = (char *) calloc(100,sizeof(char));

void *malloc(size_t size);

分配足够的内存给大小为size的对象, 并返回指向所分配区域的第一个字节的指针;

若内存不够,则返回NULL. 不对分配的空间进行初始化.

char *p = (char *)malloc(sizeof(char));

void *realloc(void *p, size_t size);

将p所指向的对象的大小改为size个字节.

如果新分配的内存比原内存大, 那么原内存的内容保持不变, 增加的空间不进行初始化.

如果新分配的内存比原内存小, 那么新内存保持原内存的内容, 增加的空间不进行初始化.

返回指向新分配空间的指针; 若内存不够,则返回NULL, 原p指向的内存区不变.

char *p = (char *)malloc(sizeof(char));

p= (char *)realloc(p, 256);

void free(void *p);

释放p所指向的内存空间; 当p为NULL时, 不起作用.

p必先调用calloc, malloc或realloc.

 

值得注意的有以下5点:

1)通过malloc函数得到的堆内存必须使用memset函数来初始化 

malloc函数分配得到的内存空间是未初始化的。因此,一般在使用该内存空间时,要调用另一个函数memset来将其初始化为全0,memset函数的声明如下:void * memset (void * p,int c,int n) ;

该函数可以将指定的内存空间按字节单位置为指定的字符c,其中,p为要清零的内存空间的首地址,c为要设定的值,n为被操作的内存空间的字节长度。如果要用memset清0,变量c实参要为0。

malloc函数和memset函数的操作语句一般如下:

int * p=NULL;

p=(int*)malloc(sizeof(int));

if(p==NULL)

    printf(“Can’t get memory!/n”);

memset(p,0,siezeof(int));

2)使用malloc函数分配的堆空间在程序结束之前必须释放 

从堆上获得的内存空间在程序结束以后,系统不会将其自动释放,需要程序员来自己管理。一个程序结束时,必须保证所有从堆上获得的内存空间已被安全释放,否则,会导致内存泄露。

我们可以使用free()函数来释放内存空间,但是,free函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free函数释放指针指向的空间之后,将指针的值置为NULL。

3calloc函数的分配的内存也需要自行释放

calloc函数的功能与malloc函数的功能相似,都是从堆分配内存,它与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。

4)如果要使用realloc函数分配的内存,必须使用memset函数对其内存初始化

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能。realloc 可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。

所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :

p = (int *) realloc(p, sizeof(int) *15);

甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。

int* p = (int *)realloc (0,sizeof(int) * 10);   //分配一个全新的内存空间,

这一行,作用完全等同于:

int* p = (int *)malloc(sizeof(int) * 10);

5)关于alloca()函数

还有一个函数也值得一提,这就是alloca()。其调用序列与malloc相同,但是它是在当前函数的栈帧上分配存储空间,而不是在堆中。其优点是:当 函数返回时,自动释放它所使用的栈帧,所以不必再为释放空间而费心。其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca 函数。尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。

这篇关于[ZZ]calloc(), malloc(), realloc(), free(),alloca()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294360

相关文章

HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译

HumanNeRF:单目视频中运动人物的自由视点绘制 引言。我们介绍了一种自由视点渲染方法- HumanNeRF -它适用于一个给定的单眼视频ofa人类执行复杂的身体运动,例如,从YouTube的视频。我们的方法可以在任何帧暂停视频,并从任意新的摄像机视点或甚至针对该特定帧和身体姿势的完整360度摄像机路径渲染主体。这项任务特别具有挑战性,因为它需要合成身体的照片级真实感细节,如从输入视频中可能

delphi : 窗体的close,free,destroy的区别

一、我用application.create(TForm2,Form2)语句,创建了Form2,可是调用了Form2.close后,重新调用Form2.show. 刚才所创建的Form2仍然存在。问为了节约资源,应该怎样使用close,free,destroy. 三者的关系是什么? 1、Action:=caFree。 2、 with TForm1.Create(Application) do

C语言动态内存空间分配(malloc,calloc,realloc,free)

为了代码观感美观,我将代码部分的注释删了 malloc #include<stdio.h>#include<stdlib.h>#include<errno.h>//使用动态内存分配函数的注意事项://1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问//3.动态内存空间中

【SPOJ】1825 Free tour II 点分治

传送门:【SPOJ】1825 Free tour II 题目分析:敲了两遍。。。 本题是论文题,具体见漆子超论文《分治算法在树的路径问题中的应用》。 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。因

Linux malloc内存分配实现原理

目录   一、用户进程虚拟内存空间布局 二、malloc工作原理 2.1 malloc实现流程 2.1.1 brk方式申请内存 2.1.2 mmap方式分配内存 2.2 核心代码 2.3 malloc分配物理内存的时机 2.4 malloc分配的实际内存大小 三、虚拟内存与物理内存 3.1 如何建立映射 3.2 分配物理内存 3.3 物理内存访问 四、new和mall

阅读笔记(五)多线程无锁的C++实现《Lock-Free Data Structures》

1. 前言   本文介绍使用C++实现多线程中无锁算法的实现和优化过程。 2. 无锁&CAS   在多线程程序中,加锁是一种必要的手段,由于保证数据操作的正确性(原子性)。但是这也在很多时候带来了性能的极度下降,因为所有共享数据的操作均需要加锁,有些时候会严重影响性能,比如当读键盘或者一些较慢的I/O操作时,锁会延误了其他线程的操作。更糟糕的是,不当操作可能会带来死锁。   首先介绍最经典

zz 这个帖子总结的很到位!

作者:Mingche Su 链接:https://zhuanlan.zhihu.com/p/21791045 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 面试应该都逃不过这个范围了。努力,加油! 1.编程语言问题(以java为例) Java vs C++ Abstract class vs interface pass by referenc

malloc和new的区别是什么?

目录 前言 ​编辑 1. 语言级别 2. 内存分配和初始化 3. 返回类型 4.失败时的行为 5. 释放内存 6. 运用场景 前言 malloc 是 C 语言的内存分配函数,简单但不支持对象初始化。new 是 C++ 中的运算符,功能更强大,能够同时进行内存分配和对象初始化,并且支持异常处理。 1. 语言级别 malloc:是 C 语言中的标准库函数,用于分配

malloc/free 和 new/delete的区别

malloc/free 和 new/delete 是 C++ 中两种不同的动态内存管理方法,它们有一些关键的区别: 1. 内存分配和释放机制 malloc 和 free: 函数: malloc 是一个 C 标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个 void* 指针,指向分配的内存块的起始位置。free 用于释放由 malloc 分配的内存,防止内存泄漏。初始化: mallo

浅谈free函数的用法

free() 函数一般是用来释放 malloc()函数或者是calloc函数申请的内存空间. 但是有一点值得注意的是,比如说 int * p; p = (int *) malloc (sizeof (int)); free (p); 虽然用了free()函数释放了内存但是p指针依然指向着当时给它分配的内存空间, 所以一般在free(p);后面加上p = NULL;这也是一个比较好的