为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配。一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间。但是,往往初学者在编写这类程序时会出错,而许多错误是因为到底为谁分配了这块内存不清楚导致的。来看下面一段程序:
#include <stdio.h>
#include <malloc.h>
void main()
{
int i=100;
int *p;
p = (int*)malloc(sizeof(int));
if (p == NULL) {
printf("内存分配不成功");
} else {
p=&i;
printf("i=%d\n",i);
printf("p=%d\n",*p);
free(p);
p=NULL;
}
while(1);
}
这段程序在编译和连接时都不会出错,并且也能在运行时产生正确的结果,但是,最终会报出内存错误。这是为什么呢?
这段程序虽然严格遵从了malloc()函数和free()函数的使用规则,按照编写者的意向,它是不会产生内存错误的,但是确实出现了内存错误,其根本原因就在于编写者没有明白分配的这块内存分配给了谁!
编写者可能认为,这块内存分配给了指针p,也就是给p分配了一块sizeof(int)大小的内存空间,这恰恰是问题的关键。因为这段程序并不是将sizeof(int)大小的内存空间分配给了p,而是分配给了p指向的那块内存空间。而在上面的程序中,这块内存空间是存放int型的变量i的,而我们知道,int型的变量i是放在栈中的,而栈空间是由编译器来分配的,而不是由程序员来分配的。既然不是由程序员分配的,那么它的释放也就不由程序员来管理,而是由编译器来管理的。这下明白了吧,程序员想管理一块本来不归自己管理的内存空间,肯定会出现内存错误。