动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】

为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配。一般情况下,在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是放在栈中的,而栈空间是由编译器来分配的,而不是由程序员来分配的。既然不是由程序员分配的,那么它的释放也就不由程序员来管理,而是由编译器来管理的。这下明白了吧,程序员想管理一块本来不归自己管理的内存空间,肯定会出现内存错误。

猜你喜欢

转载自blog.csdn.net/leon1741/article/details/79794141