在C语言中有内存分配管理的,如果没用malloc分配内存,真接的源代中声明变量数,那么它们的创建是在堆栈中的。
如
{
int a[10];
//在堆栈中创建10个int变量
}
return 0;
//程序运行到这,堆栈指针回到未声明int a[10]的地址处。在用数组将会出错!
而在很多初学者的代码中很多有这样之类的声明 int a[1000],b[1000];我看得很恐怖
如果用malloc分配的内存,它是单独在内存中的,C语言有个内存管理的记录这个地址分配了多少空间
以后调用free()就直接找到分配的地址回收就可,
如
{
int *a;
a = (int*) malloc(10*sizeof(int));
............................
free(a);
}
free(a) //如果将free函数放在这,将会出错,因为指针a是堆栈变量,前面以说的很清楚了。因为指针被释放了
//在调用free函数a指针将不存在,在分配管理中找不到这个地址,
但如果这样呢????
typedef struct DATA
//结构A
{
int i;
char b;
}DATA,*PDATA;
typedef struct NUMBER{
//结构B
int i;
PDATA a;
//结构A的指针
}NUMBER,*PNUMBER;
void *p;
PDATA
a;
//A结构指针
PNUMBER
c;
//B结构指针
p = malloc(sizeof(NUMBER) + sizeof(DATA));
//分配两个相连的结构大小的内存
c = (PNUMBER) p;
//在强行转换
c.a = (PDATA) (p + sizeof(NUMBER));
//取得A结构的地址
free(c.a);
free(c);
//这样做肯定会出错
//正确的应该这样free(p)或free(c)的其中一个这样很方便,在某些程序很好用,就如在将文件写入磁盘中