c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr
void
* __cdecl alloca(
size_t
);
alloca是向栈申请内存,因此无需释放.
malloc,alloc,realloc之间的相似与区别
三个函数的申明分别是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函数库内。它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL。
malloc与calloc的区别为1块与n块的区别:
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。(也可以缩小,缩小的内容消失)。
另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。calloc在动态分配完内存后,自动初始化该内存空间为零。
malloc() 函数和calloc ()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是 0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还 没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。
realloc有个细节需要注意:
无非就是将已经存在的一块内存扩大。
char* p = malloc(1024);
char* q = realloc(p,2048);
现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放 q的空间就可以了。
因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。
后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。
仔细查了下资料。得到如下信息:
1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。
2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。
这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。
这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc 分配失败后,p原先所指向的内存地址丢失。
转载于:https://www.cnblogs.com/lisuyun/p/4314000.html
c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr相关推荐
- c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- 【C语言进阶深度学习记录】三十三 C语言中动态内存分配
如何在程序运行的时候动态给程序分配内存? 文章目录 1 动态内存分配的意义 1.1 C语言中如何动态申请内存空间 1.2 malloc和free的用法 1.3 calloc与realloc 1.31 ...
- C语言中多维数组的内存分配和释放(malloc与free)(转)
C语言中多维数组的内存分配和释放(malloc与free)(转) 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组( ...
- C/C++语言变量声明内存分配
[cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...
- 【C语言】动态内存分配
[C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...
- 【C语言】------ 动态内存分配
动态内存开辟详解 动态内存分配 什么是动态内存分配? 一.为什么使用动态内存分配呢? 二.动态内存函数 1.malloc和free 2.calloc和realloc 三.常见的动态内存错误 1.对`N ...
- 4 OC 中的内存分配以及内存对齐
目录 一 OC 中的内存分配 一 OC 中的内存分配 student 结构体明明是20?为什么是24个字节,因为结构体会按照本身成员变量最大的内存进行对齐,最大成员变量是8个字节,因此就是8的 ...
- 替换libc中的内存分配函数
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 本文介绍如何替换glibc中的内存分配函数为自定义的内存分配函数的方法,可以方便调试内存分配,和查找内存管理错误而产生 ...
- C 语言中的内存分析
C 语言中的内存分析 一.进制 我们需要了解的4中进制:二进制.八进制.十进制.十六进制 #include <stdio.h> int main() { //默认情况下是十进制 intnu ...
最新文章
- [JavaScript]利用JavaScript控制table中row的显示
- SQLite指南(0) 表和索引的文件存储结构
- 杭电 HOJ 3038 How Many Answers Are Wrong 解题报告
- 无责任书评——DOOM启示录 BORLAND传奇
- IP防护等级标准及规定
- Mineros 远程登录,外网登录,解决无法在家控制机器的问题
- 解决RestTemplate的No instances available for localhost错误
- 英特尔携手生态伙伴亮相InfoComm,赋能协作办公迈向智能时代
- Codeforces Round #548 (Div. 2) 1139 D+2021天梯赛l3-3 解题报告(负二项式分布+莫比乌斯容斥+杜教筛(天梯赛))
- 具象的东西_艺术家宋永红:我喜欢具象的东西
- mfc使用键盘加速键
- DDR,DDR2,DDR3,SDRAM比较区别
- Find Abandoned Memory
- 一款炫酷Loading动画--加载失败
- 联想C++实习面试凉经
- docker 基础命令操作 镜像以及容器的基本操作演示
- 【水滴石穿】ReactNativeMobxFrame
- 等差数列和等比数列的公式、法则、定理
- 高通开发系列 - 内核升级后音频驱动的开发和调试
- 厚积薄发与Lucky Dog