现在的位置: 首页 > 综合 > 正文

C中的内存分配

2013年08月04日 ⁄ 综合 ⁄ 共 1030字 ⁄ 字号 评论关闭
一个C程序占用的内存可分为以下几类: 
(一)  栈 
这是由编译器自动分配和释放的区域。主要存储函数的参数,函数的局部变量等。当一个函数开始执行时,该函数所需的实参,局部变量就推入栈中,该函数执行完毕后,之前进入栈中的参数和变量等也都出栈被释放掉。它的运行方式类似于数据结构中的栈。 
(二) 堆 
这是由程序员控制分配和释放的区域,在C里,用malloc()函数分配的空间就存在于堆上。在堆上分配的空间不像栈一样在某个函数执行完毕就自动释放,而是一直存在于整个程序的运行期间。当然,如果你不手动释放(free()函数)这些空间,在程序运行结束后系统也会将之自动释放。对于小程序来说可能感觉不到影响的存在,但对于大程序,例如一个大型游戏,就会遇到内存不够用的问题了。 
(三) 全局区 
C里的全局变量和静态变量存储在全局区。它们有点像堆上的空间,也是持续存在于程 
    序的整个运行期间,但不同的是,他们是由编译器自己控制分配和释放的。 
(四) 文字常量区 
例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。 
(五) 程序代码区 
存放函数体的二进制代码。 

2. 例子(一) 
int a = 0; //全局区 

void main() 

    int b; //栈 
    char s[] = "abc"; //s在栈,"abc"在文字常量区 
    char *p1,*p2; //栈 
    char *p3 = "123456"; //"123456"在常量区,p3在栈上 
    static int c =0; //全局区 
    p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆 
    p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆 
    strcpy(p1, "123456"); //"123456"放在常量区 
    //编译器可能将它与p3所指向的"123456"优化成一个地方。 
} 

3. 例子(二) 
//返回char型指针 
char *f() 
{ 
    //s数组存放于栈上 
    char s[4] = {'1','2','3','0'}; 
    return s; //返回s数组的地址,但程序运行完s数组就被释放了 
} 
void main() 

    char *s; 
    s = f(); 
    printf ("%s", s); //打印出来乱码。因为s所指向地址已经没有数据 
}

抱歉!评论已关闭.