系统

C语言内存模型

2017-07-04  本文已影响52人  第八区

内存四区

1栈区

由编译器自动分配释放 ,存放函数的参数值,局部变量的值等

2.堆区

一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回

3.静态全局数据区

主要包括静态全局区和常量区

  • char *s = "HelloWorld";//该字符串 HelloWorld 即存放于文字常量区,不可修改。但指针s存放于栈区。
    若在程序中尝试对其修改(例如尝试修改第一个字符 *s = 'h';),将出现编译可通过,运行报错的情况。
4.代码区

存放函数体的二进制代码。用于存储程序编译连接后生成的二进制机器码指令的内存区域

区别

实验

代码
int add(int x, int y);
int sub(int x, int y);

int main() {
    int c = 30;
    int d[10];
    int *p=malloc(sizeof(int)*2);
    int *p1=malloc(sizeof(int));
    printf("-----static--------\n");
    printf("%x\n", &a);
    printf("%x\n", &b);
    printf("------stack-------\n");
    printf("%x\n", &c);
    printf("%x\n", &d);
    printf("%x\n", &p);
    printf("%x\n", &p1);
    add(a,b);
    sub(b,c);
    printf("------heap-------\n");
    printf("%x\n", p);
    printf("%x\n", p1);
    printf("------code-------\n");
    printf("%x\n", add);
    printf("%x\n", sub);
}

int add(int x, int y) {
    printf("%x\n", &x);
    printf("%x\n", &y);
    return x + y;
}

int sub(int x, int y) {
    printf("%x\n", &x);
    printf("%x\n", &y);
    return x - y;
}
结果
-----static--------
405008
40500c
------stack-------
28ff3c
28ff14
28ff10
28ff0c
28fef0
28fef4
28fef0
28fef4
------heap-------
4629f0
462a00
------code-------
401933
401969
上一篇 下一篇

猜你喜欢

热点阅读