C指针与malloc,free

首先什么是指针:指针用来存放变量的地址,也就是操作操作内存。C语言中定义一个指针变量存储内存的地址,它是一个32位无符号整数的值。


1、如何初始化一个指针

int *pbuff1; 和 int *pbuff2 = NULL;的区别是什么呢

首先,*pbuff1没有初始化指向NULL,也没指向合法的内存。所以*pbuuf1是个野指针。它会胡乱指向一个地址,这是很危险的。当你对野指针进行写操作的时候,没人会知道结果怎样,可能会修改掉程序中其它值。

*pbuff2初始化为NULL指针,表示*pbuff2不指向任何内容,将指针悬空。指针就不会乱指一气了。



2、如何使用一个指针

建议使用前给指针分配空间。一般使用指针的时候就知道需要多大的空间了。

这就用到malloc: 

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)

pBuff = malloc(lenAll*sizeof(char));
if(pBuff!=NULL)
{
	memcpy(pBuff,buff,8*sizeof(char));
}

这里是先分配一个空间,然后把内存地址指向了pBuff,如果分配成功了,就把接收到buff里的值存放到pBuff指针。

同样初始化unsigned char *pBuff = NULL;



3、如何防止内存泄漏

malloc对应着free:

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

注意free到底释放了什么:

free()释放的是指针指向的内存。指针变量依然存在,只有程序结束时才被销毁。不过现在指针指向的内容是未定义的垃圾,所以现在指针又成为了野指针。

因此,释放内存后把指针指向NULL,悬空。防止指针在后面不小心又被解引用了。

同时,确认不用这块内存了在free,不要free完了接着使用。

free()应该是从malloc()出来的地址开始free():

如果指针在free前有偏移(pbuff+1),free的时候就会出错。建议再定义一个pbufftemp = pbuff;用pbufftemp去偏移,最后free(pbuff)。



4、补充:

malloc和free是一一对应的,如果你只malloc一次,相应的就要free一次,重复释放是错误的。

malloc()函数的工作机制:
  malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值