
简介: 对于指针来说,正确分配动态内存非常重要,本文将重点介绍动态内存分配函数malloc,calloc,realloc和memset的使用.
i. 对于malloc,在终端输入#: man malloc以知道函数原型为
Void * calloc(size_t size),包含在库函数stdlib.h中,作用是在内存的堆区域中分配一个大小为size的连续空间,如果内存分配成功,则该函数返回新分配的内存的第一个地址,否则返回NULL. 注意: 鉴于上述情况,通常在编写程序时,必须判断内存分配是否成功. 以下程序语句:
int * p;
p =(int *)malloc(sizeof(int));
如果(p!= NULL)
.................................... //要执行的语句

其他
................... //打印不成功的内存分配错误消息
内存分配失败的常见原因如下:
1,内存访问超出范围
2. 所需的连续存储空间不足
ii. calloc的用法与malloc大致相同,函数原型为:
void * callo(size_t num,size_t大小),功能是在内存中分配连续大小

Num *大小空间,这反映在动态数组的内存分配,返回值以及返回是否成功与上面相同,重点在下面讨论
malloc和calloc之间的区别:
1. 后者在将指针返回到内存之前将其初始化为0.
2. 请求内存量的方法不同. malloc的参数只是要分配的内存字节数; calloc的参数包括元素数和每个元素的字节数.
为说明第一点,请参见以下过程: 过程

程序在gcc编译后为第6行的指针p动态分配内存,结果如下:

从图中可以看出,红色标记的部分没有初始化为零,这意味着该单元中存在一个随机数,因此程序在运行时可能是错误的.
用calloc调用上述程序,过程如下:

请参见上述程序的第6行. 使用calloc而不是malloc分配内存单元. 结果如下:

可以看出,用calloc进行内存应用时,内存被初始化为0.

那么有没有一种方法可以使用malloc同时将内存初始化为0?答案是肯定的,您可以使用Menset实现此功能并相应地更改第一个程序. 程序如下:

在第七行二维指针calloc,添加语句menset(p,0,100). 该语句意味着,存储单元p指向的所有100个存储单元都被赋值为0,这相当于初始化存储.
这时,运行程序将不再在上面红色标记的部分显示结果.
iii. 对于realloc(),函数原型为* void realloc(无效* ptr,size_t大小),将ptr指向的内存区域的大小更改为size长度,如果重新分配成功二维指针calloc,则返回指向已分配内存的指针,否则返回NULL. 当不再使用内存时,应使用free()函数释放内存块.
注意事项: 成功分配内存后,应设置原始指针ptr = NULL,否则将形成通配指针,这可能导致系统崩溃.
提示: 无论采用哪种申请内存的方法,申请内存后,最终都必须使用free释放空间,否则会导致内存泄漏.
:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-206816-1.html
一直很好
可口可乐是真牛逼