free()以及malloc()用法

realloc,malloc,calloc的区别
三个函数的申明分别是: 
void* realloc(void* ptr, unsigned newsize); 
void* malloc(unsigned size); 
void* calloc(size_t numElements, size_t sizeOfElement); 
都在stdlib.h函数库内
它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 
 
malloc用于申请一段新的地址,参数size为需要内存空间的长度,(分配指定字节数的存储区,初始值不确定)

如: 
char* p; 
p=(char*)malloc(20);
calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,(为指定数量指定长度的对象分配存储空间,空间中每一位(bit)都初始化为0)如: 
char* p; 
p=(char*)calloc(20,sizeof(char)); 
这个例子与上一个效果相同
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度                        (增加或减少以前分配区的长度,当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域的初始值是不确定的)
如: 
char* p; 
p=(char*)malloc(sizeof(char)*20); 
p=(char*)realloc(p,sizeof(char)*40);
注意,这里的空间长度都是以字节为单位。 
 
C语言的标准内存分配函数:malloc,calloc,realloc,free等。 
malloc与calloc的区别为1块与n块的区别: 
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。 
 
 
free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。

注意:连续两次使用free函数,肯定会发生错误。malloc的次数要和free的次数相等。

C++中为new/delete函数。

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
str = NULL;
即本程序已经放弃再使用他。
何谓“野指针”,在这里补充一下。


野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。


造成“野指针”的原因主要有
1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。
2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。
3.指针操作超越了变量的作用范围。  注意其生命周期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
malloc()和free()是C语言中动态内存分配的函数。 malloc()函数用于在堆内存中动态分配指定大小的内存空间,并返回一个指向该内存空间的指针。其原型如下: void *malloc(size_t size); 其中,size_t是一个无符号整数类型,表示要分配的内存空间的字节数。malloc()函数返回一个指向分配的内存空间的指针,如果分配失败,则返回NULL。 示例用法: ```c int* ptr; ptr = (int*)malloc(5 * sizeof(int)); // 分配5个int大小的内存空间 if (ptr == NULL) { // 处理内存分配失败的情况 } else { // 内存分配成功,可以使用ptr指针访问分配的内存空间 // ... free(ptr); // 释放分配的内存空间 } ``` free()函数用于释放之前通过malloc()函数分配的内存空间。其原型如下: void free(void *ptr); 其中,ptr是之前通过malloc()函数分配的内存空间的指针。使用free()函数释放内存空间后,该指针将成为一个野指针,不能再访问该内存空间。 示例用法: ```c int* ptr; ptr = (int*)malloc(5 * sizeof(int)); // 分配5个int大小的内存空间 if (ptr == NULL) { // 处理内存分配失败的情况 } else { // 内存分配成功,可以使用ptr指针访问分配的内存空间 // ... free(ptr); // 释放分配的内存空间 ptr = NULL; // 避免成为野指针 } ``` 需要注意的是,使用malloc()函数分配的内存空间在使用完后必须通过free()函数释放,否则会导致内存泄漏。另外,对已经释放的内存空间进行访问是一种未定义行为,可能导致程序崩溃或其他不可预测的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值