C语言内存四区

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/6146865.html 

1、栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。

2、堆区: 一般由程序员分配并释放,若程序员不释放,程序结束时可能由操作系统回收 。

3、数据区:主要包括静态全局区和常量区。

  • 全局区:又称为静态区。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域。未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后有系统释放。
  • 常量区 :常量字符串就是放在这里的。 程序结束后由系统释放 

4、代码区:存放函数体的二进制代码。

 

分清楚变量的内存处于哪个区对于编程至关重要。

一个典型的,却比较晦涩的例子:

int main() {
    char * f = "abcde";

    char i = f[1];
    printf("%c
",i);    // 打印输出 b

    f[1] = 'z';  // ERROR,无法继续运行。
    printf("%s
",f);

    return 0;
}

该代码可以通过编译,但无法执行完。程序会死掉。

为什么?


char * f = "abcde";

该语句分配的字符串位于"常量区"。所以,只可读,不可改。因此报错。

这段代码比较“恐怖”的地方就是,该代码可以通过编译,却无法执行完。

这段代码如果做一下小小的转换:

int main() {
    char f[] = "abcde";

    char i = f[1];
    printf("%c
",i);    // 打印输出 b

    f[1] = 'z';
    printf("%s
",f);    // 打印输出 azcde

    return 0;
}

此处: char f[] = "abcde";

该"abcde"位于栈区。所以可以被修改。

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/6146865.html 

原文地址:https://www.cnblogs.com/shijiaqi1066/p/6146865.html