free(pointer):
- free 后指针是否存在:指针 pointer 还在。因为指针是在栈空间分配的,free 掉的是指针指向的那块区域。也就是说指针的值域本来是堆空间的某个地址,free 之后原来的值域不见了。
- free 后 pointer 的指向:随机指向。通常 free 操作下一步,应该把指针指向 NULL,避免野指针。
void * malloc(size):
- 返回 void * 类型
- 在堆上分配 size 大小空间
- 空间没有初始化
void * colloc(times, size):
- 返回 void * 类型
- 在堆上分配 times*size 大小空间
- 空间初始化
extern * realloc(pointer, newSize):
三点注意:
1,自动释放 pointer 空间。(即指针漂移)
2,extern* 返回情况:
- 如果 pointer 空间后面还有空间,其大小为 partSize,则返回 pointer ,新内存空间大小为 newSize = oldSize + partSize。
- 如果 pointer 空间后面没有空间,则释放 pointer,并返回 newPointer,新的内存空间大小为 newSize。
- 如果分配失败,则原空间不变,并且返回 NULL
3,NULL 的情况:
- pointer 为NULL,等同于 malloc 函数
- newSize = 0,则相当于 free(pointer)
- 返回值为 NULL,则分配失败,原空间不发生变化
代码分析
#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
int main(void){
char *p, *q, *r;
p = (char * ) malloc (10);
q=p;
r = (char * ) realloc (p,20);
p = NULL;
q = NULL;
return 0;
}
- 假设此时 p 后面没有空间,此时 realloc 会释放 p 空间,并将 p 中的内容拷贝到新的地址,返回一个新的地址,将其赋值为 r。
- 由于 q = p 是值域赋值。所以 p 被释放,相当于 q 也被释放。此时 p 值域 和 q 值域都是随机的一个地址,不一定相等。