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\n",i); // 打印输出 b f[1] = 'z'; // ERROR,无法继续运行。 printf("%s\n",f); return 0; }
该代码可以通过编译,但无法执行完。程序会死掉。
为什么?
char * f = "abcde";
该语句分配的字符串位于"常量区"。所以,只可读,不可改。因此报错。
这段代码比较“恐怖”的地方就是,该代码可以通过编译,却无法执行完。
这段代码如果做一下小小的转换:
int main() { char f[] = "abcde"; char i = f[1]; printf("%c\n",i); // 打印输出 b f[1] = 'z'; printf("%s\n",f); // 打印输出 azcde return 0; }
此处: char f[] = "abcde";
该"abcde"位于栈区。所以可以被修改。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。
http://www.cnblogs.com/shijiaqi1066/p/6146865.html