c程序中存储空间布局
来源:互联网 发布:java程序监听端口 编辑:程序博客网 时间:2024/05/13 06:06
一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。
二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。
三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。
四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)
五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:
我们首先说一下,栈的应用。
程序1:
#include <stdio.h>#include <stdlib.h>char *GetString(void){char p[] = "Hello, World";return p;}int main(void){char *str = NULL;str = GetString();printf("%s\n", str);}上面的程序例子,是错误的。因为 char p[] = "Hello, World"; 数组占有的空间在函数GetString()调用后,将会把收回,所以是错误的。一般编译器会报出这样的错误, warning: function returns address of local variable,因此说,千万不能用return语句返回指向“栈内存”的指针。
然后我再说一下堆的应用吧。
程序二
#include <stdio.h>#include <stdlib.h>#include <string.h>char *GetString(int num){char *p = (char *)malloc(sizeof(char)* num);return p;}int main(void){char *str = NULL;str = GetString(100);strcpy(str, "Hello, World");printf("%s\n", str);free(str);}
在程序二中,GetString()申请空间,函数被调用结束后,不会被释放。故空间可以被使用。因此可以说,用return语句可以返回指向“堆内存”的指针。
- c程序中存储空间布局
- C程序存储空间布局
- C程序存储空间布局
- c程序存储空间布局
- C程序存储空间布局
- c程序存储空间布局
- C程序存储空间布局
- c程序的存储空间布局
- C程序的存储空间布局
- C 程序的存储空间布局
- C程序的存储空间布局
- C程序的存储空间布局
- C程序的存储空间布局
- C程序的存储空间布局
- C程序的存储空间布局
- C 程序的存储空间布局
- C程序的存储空间布局
- linux C程序存储空间布局
- 有效创建oracle dblink 的两种方式
- FLEX 下的MVP应用 以及 ColdFusion 的远程服务调用
- 深入Java单例模式
- 二叉树递归遍历和非递归遍历
- ios UITapGestureRecognizer 单指单击、单指多击、多指单击、多指多击事件操作
- c程序中存储空间布局
- 截取视图 保存
- org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-fo
- 色彩感觉
- sql语句优化
- URI与Path的的分析
- MonoDevelop 调试 Unity3D项目 告别Debug.log()
- QT 2D绘图的坐标系统与图形显示
- c++的float类型包含的最值问题....