c语言程序运行时 内存问题

c语言程序运行时 内存问题,第1张

程序的具体执行过程为例来给你讲解,但愿你能理解:

1.程序被打开时,即程序开始运行时,会首先向 *** 作系统请求独占内存空间(一段在程序整个执行过程中都不释放的空间), *** 作系统会应答请求并分配一段逻辑上连续(其实是将零散的内存空间映射为一段连续的空间)的内存空间给该程序,此时程序得到该段空间的逻辑地址信息,根据地址将扒衫卖程序代码段和数据段装入内存,此时程序载入完成。

2.程序运行中,当某一过程任务需要更大内存空间时,会再次向 *** 作系统发出请求, *** 作系统会根据请求再次分配内存空间给该程序,当这一过程任务执行完毕后,该内存空间被释放。同时由于 *** 作系统的存储保护,程序在运行过程中只能访问自己所申请的内存空间,不能访问其他程序的内存空间。

3.当程序执行塌嫌完毕或关闭程序后,该程序所占的所有内存空间都被释放。

当你再次打开程序后,重复上面的过程。

下面对你的问题进行针对性回答:

1.当程序运行时,会调入内存,不同时间运行,程序放在内存的位置也可能不同:每春逗运行一次程序,程序都会重新向 *** 作系统申请内存空间,这时 *** 作系统会分配一段全新的内存空间给程序,故不同时间运行程序,程序在内存中的位置是不同的。

2.使用内存中数据的位置也可能不同:当程序申请内存空间后, *** 作系统会将所申请的内存空间的地址传给程序,尽管数据的位置不同,但程序知道数据的地址,故程序依然可以根据地址来找到所需要的数据。

一个程序内存分配:

下图是APUE中的一个典型C内存空间分布图(虚拟内存)

例如:

int g1=0, g2=0, g3=0

int max(int i)

{

int m1=0,m2,m3=0, p_max

static n1_max=0,n2_max,n3_max=0

p_max = (int )malloc(10)

printf("打印max程序地址\n")

printf("in max: 0xx\n\n",max)

printf("打卜李印max传入参数地灶弊顷址\n")

printf("in max: 0xx\n\n",&i)

printf("打印max函数中静态变量地址\n")

printf("0xx\n",&n1_max)//打印各本地变量的内存地址

printf("0xx\n",&n2_max)

printf("0xx\n\n",&n3_max)

printf("打印max函数中局部变量地址\n")

printf("0xx\n",&m1)//打印各本地变量的内存地址

printf("0xx\n",&m2)

printf("0xx\n\n",&m3)

printf("打印max函数中malloc分配地址\n")

printf("0xx\n\n",p_max)//打印各本地变量的内存地址

if(i) return 1

else return 0

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0

int v1=0, v2, v3=0

int p

p = (int )malloc(10)

printf("打印各全局变量(已初始化)的内存地址隐陆\n")

printf("0xx\n",&g1)//打印各全局变量的内存地址

printf("0xx\n",&g2)

printf("0xx\n\n",&g3)

printf("======================\n")

printf("打印程序初始程序main地址\n")

printf("main: 0xx\n\n", main)

printf("打印主参地址\n")

printf("argv: 0xx\n\n",argv)

printf("打印各静态变量的内存地址\n")

printf("0xx\n",&s1)//打印各静态变量的内存地址

printf("0xx\n",&s2)

printf("0xx\n\n",&s3)

printf("打印各局部变量的内存地址\n")

printf("0xx\n",&v1)//打印各本地变量的内存地址

printf("0xx\n",&v2)

printf("0xx\n\n",&v3)

printf("打印malloc分配的堆地址\n")

printf("malloc: 0xx\n\n",p)

printf("======================\n")

max(v1)

printf("======================\n")

printf("打印子函数起始地址\n")

printf("max: 0xx\n\n",max)

return 0

}

打印结果:

ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****)

包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址

3 加载:

一个由C/C++编译的程序占用的内存分别为以下四个部分:

程猜州帆序代码区:存放程序的二进制代码。

静态数据区:存放程序运行期间用到的数据。其存储空间是在编译时分配的,在整个程序执行期间静态数据区中的数据一直存在,程序结束后由系统释放。穗雹

动态内存区(也称栈):也存放程序运行期间用到的迹纯数据,其存储空间在程序运行期间由编译器自动分配释放,其生命周期短于程序的运行期。

堆区:由程序员分配释放,若程序员不释放,程序结束时可能由系统回收。

以上内容抄自课本《C语言与程序设计》(电子工业出版社)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8243573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存