刚学C不久,整理一些小小资料,希望对学C的朋友能起到一点作用,也巩固一下学习,同时如有说错的地方还望指正。
#include <stdio.h>
#define pi 3.14
int main(int argc,const char* argv[])
{
pi = pi + 1;
printf("%f",pi);
}
进程(Process)是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
进程的内存分布以及功能特点如下:
低地址 |text 代码段 存储二进制指令和常量 只读 如果修改会产生段错误 大小不限制
|data 全局数据段 初始化过的全局变量和静态变量 大小不限制
|bss 静态数据段 未初始化过的全局变量和静态变量,在程序执行前会被初始化为0,所以会有默认值 大小不限制
|heap 堆 手动管理,这段内存不能和标识符建立映射关系(无法取名), 必须和指针配合使用
| 1.足够大
| 2.不能自动释放而需要手动释放导致使用麻烦
| 3.容易产生内存泄漏和内存碎片
高地址 ↓stack 栈 自动管理,自动分配内存,执行结束自动释放
1.使用方便
2.栈结构比较安全
3.不会产生内存泄漏和内存碎片
4.大小有限所以过大会产生段错误
5.分配释放不可控不适合长期的数据保存
由下可以看出,常量存储于text段,只可读不可更改(如下图)
#include <stdio.h>
#define pi 3.14
int main(int argc,const char* argv[])
{
pi = pi + 1;
printf("%f",pi);
}
代码一
图片一
在Linux系统vim编译器预处理(图片一)下我们不难看出pi为常量,且3.14(pi所替换)=3.14(pi所替换)+1显然不成立。
data和bss分别存放初始化后的静态、全局变量和未初始化过的静态、全局变量(如下图(仅演示全局变量))。
#include <stdio.h>
int main(int argc,const char* argv[])
{
}
代码二
图片二
#include <stdio.h>
int Num;
int main(int argc,const char* argv[])
{
}
代码三
图片三
#include <stdio.h>
int Num = 100;
int main(int argc,const char* argv[])
{
}
代码四
图片四
图二图三对比可以看出,当我设定一个int类型(4字节)全局变量(未初始化)的时候,bss段数值由4变为了8,增加了4,说明未初始化的全局变量存在于bss段。
图二图四对比可以看出,当我设定一个int类型(4字节)的全局变量(初始化后)的时候,data段值由272变为276,增加了4,说明初始化后的全局变量存在于data段。
作为程序员最为熟悉的莫过于堆和栈,堆空间和栈空间的大小是可变的,堆空间从下往上生长(即从低地址向高地址使用),栈空间从上往下生长(即高地址向低地址使用)(如图五所示)它们同时向中心区域未使用的内存挤压。对于作用上述的功能特点里可以查看这里就不在作说明
图片五