首页 > 编程语言 > 详细

C语言 内存四大存储区域

时间:2016-01-18 20:31:37      阅读:177      评论:0      收藏:0      [点我收藏+]
#include<stdio.h>
#include<stdlib.h>

//程序代码指令,define定义的常量,常量字符串---代码区(只读)
//全局(关键)变量/常量,静态(关键)变量/常量---静态区
//局部变量---栈区
//由malloc或者realoc,calloc分配的内存区域---堆区


#define PI 3.14   //

//全局变量
int a = 10;
int b[5] = {1,2,3,4,5};
int const c = 2;


void main(){
    char *p = "asdfadsf";//"asdfadsf"是字符串常量,在代码区,只读
    //指针p是临时变量,在栈区
    //验证 "asdfadsf" 只读
    //*p = ‘a‘;//编译不报错
    printf("%s\n",p);//运行报错--“写入位置 0x001B692C 时发生访问冲突。”,由此证明"asdfadsf"是字符串常量,只读

    //堆只能是malloc或者realoc,calloc,分配的内存才是堆
    //例如以下代码
    void *p1 = malloc(sizeof(int)* 1024);//malloc(sizeof(int)* 1024);分配的内存就是堆区,但是指针p1是在栈区
    //堆的使用情况:①无法确定需要内存的大小;②需要的内存很大
    //堆的注意点:堆和栈不同,堆的内存大小是由程序员分配的,必须由程序员手动释放(free(p1););
    //对于栈来说,栈的内存大小由系统分配(栈的极限大约是1M,非常小),所以栈的内存空间是由系统回收的

    //堆的内存大小是由程序员分配的,理论上可以占据系统中所有的内存(甚至能抢占栈的内存空间)
    //因为栈的内存空间是由系统回收的,所有在回收的时候会消耗大量的cpu
    char d = a;//变量d在栈区中

    system("pause");
}

//run1是程序代码,所以存储在代码区
void run1(){
    while (1){
        int x = 0;//x变量在栈区,因为while循环,x每次循环都会初始化,所以系统不断的在栈上创建x,回收x,会消耗大量的cpu
        printf("%d",x);
    }
}

int add(int a, int b){//形参a,b是临时变量,存储在栈区
    return a + b;
}

 

C语言 内存四大存储区域

原文:http://www.cnblogs.com/zhanggaofeng/p/5140178.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!