首先什么是指针:指针用来存放变量的地址,也就是操作操作内存。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函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。