完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
(一)C程序内存分配 1.内存分配图解 其中C程序的内存分配为栈区、堆区、全局区、常量区和代码区这五大区域,而全局区又分为.bss段和.data段。一般来说,代码区、数据区、.bss在程序运行之后,大小都是固定的,而栈区和堆区是根据数据的多少再自由的扩张,堆区从小到大扩张,栈区从大到小扩张(即堆区由低地址向高地址生长,栈区由高地址向低地址生长),合理分配和使用内存,能够使内存利用率最大化。 2.内存分配介绍 1、栈区(stack)
2、堆区(heap)
3、全局区(静态区)
4、常量区
5、代码区
(二)Ubuntu系统下实验验证 1.详细代码 #include #include int k1 = 1; //已初始化全局int型变量k1 int k2; //未初始化全局int型变量k2 static int k3 = 2; //已初始化静态全局int型变量k3 static int k4; //未初始化静态全局int型变量k4 int test() { int j1; int j2; printf("未初始化局部int型变量j1 :%pn", &j1); printf("未初始化局部int型变量j2 :%pn", &j2); return 0; } int main() { static int m1 = 2; //已初始化静态局部int型变量m1 static int m2; //未初始化静态局部int型变量m2 int i1; //未初始化局部int型变量i1 int i2; //未初始化局部int型变量i2 char *p; //未初始化局部char型指针变量p char str[10] = "hello"; //已初始化局部char型数组str char *var1 = "123456"; //已初始化局部char型指针变量var1 char *var2 = "abcdef"; //已初始化局部char型指针变量var2 int *p1 = malloc(4); //已初始化局部int型指针变量p1 int *p2 = malloc(4); //已初始化局部int型指针变量p2 printf("栈区-变量地址n"); printf("未初始化局部int型变量i :%pn", &i1); printf("未初始化局部int型变量i2 :%pn", &i2); printf("未初始化局部char型指针变量p :%pn", &p); printf("已初始化局部char型数组str :%pn", str); test(); printf("n堆区-动态申请地址n"); printf("已初始化局部int型指针变量p1 :%pn", p1); printf("已初始化局部int型指针变量p2 :%pn", p2); printf("n.bss段地址n"); printf("未初始化全局int型变量 k2 :%pn", &k2); printf("未初始化静态全局int型变量k4 :%pn", &k4); printf("未初始化静态局部int型变量m2 :%pn", &m2); printf("n.data段地址n"); printf("已初始化全局int型变量k1 :%pn", &k1); printf("已初始化静态全局int型变量k3 :%pn", &k3); printf("已初始化静态局部int型变量m1 :%pn", &m1); printf("n常量区地址n"); printf("已初始化局部char型指针变量var1:%pn", var1); printf("已初始化局部char型指针变量var2:%pn", var2); printf("n代码区地址n"); printf("程序代码区main函数入口地址 :%pn", &main); free(p1); free(p2); return 0; } 2.实验结果 3.实验结果分析
(三)STM32系统下实验验证 1.详细代码 #include "led.h" #include "delay.h" //#include "key.h" #include "sys.h" #include "usart.h" #include #include int k1 = 1; //已初始化全局int型变量k1 int k2; //未初始化全局int型变量k2 static int k3 = 2; //已初始化静态全局int型变量k3 static int k4; //未初始化静态全局int型变量k4 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 //KEY_Init(); //初始化与按键连接的硬件接口 while(1) { static int m1 = 2; //已初始化静态局部int型变量m1 static int m2; //未初始化静态局部int型变量m2 int i1; //未初始化局部int型变量i1 int i2; //未初始化局部int型变量i2 char *p; //未初始化局部char型指针变量p char str[10] = "hello"; //已初始化局部char型数组str char *var1 = "123456"; //已初始化局部char型指针变量var1 char *var2 = "abcdef"; //已初始化局部char型指针变量var2 int *p1 = malloc(4); //已初始化局部int型指针变量p1 int *p2 = malloc(4); //已初始化局部int型指针变量p2 printf("栈区-变量地址rn"); printf("未初始化局部int型变量i1 :0x%prn", &i1); printf("未初始化局部int型变量i2 :0x%prn", &i2); printf("未初始化局部char型指针变量p :0x%prn", &p); printf("已初始化局部char型数组str :0x%prn", str); //test(); printf("n堆区-动态申请地址rn"); printf("已初始化局部int型指针变量p1 :0x%prn", p1); printf("已初始化局部int型指针变量p2 :0x%prn", p2); printf("n.bss段地址rn"); printf("未初始化全局int型变量k2 :0x%prn", &k2); printf("未初始化静态全局int型变量k4 :0x%prn", &k4); printf("未初始化静态局部int型变量m2 :0x%prn", &m2); printf("n.data段地址rn"); printf("已初始化全局int型变量k1 :0x%prn", &k1); printf("已初始化静态全局int型变量k3 :0x%prn", &k3); printf("已初始化静态局部int型变量m1 :0x%prn", &m1); printf("n常量区地址rn"); printf("已初始化局部char型指针变量var1:0x%prn", var1); printf("已初始化局部char型指针变量var2:0x%prn", var2); printf("n代码区地址rn"); printf("程序代码区main函数入口地址 :0x%prn", &main); free(p1); free(p2); } } 2.实验结果
FLASH占用大小计算公式:Code+RO-data
程序占用FLASH 大小为:6680字节(6332+348),所用的 SRAM 大小为:1824 个字节(84+1740)
栈区-变量地址 未初始化局部int型变量i1 :0x2000071c 未初始化局部int型变量i2 :0x20000718 未初始化局部char型指针变量p :0x20000714 已初始化局部char型数组str :0x20000708 堆区-动态申请地址 已初始化局部int型指针变量p1 :0x20000128 已初始化局部int型指针变量p2 :0x20000130 .bss段地址 未初始化全局int型变量k2 :0x20000004 未初始化静态全局int型变量k4 :0x2000000c 未初始化静态局部int型变量m2 :0x20000014 .data段地址 已初始化全局int型变量k1 :0x20000000 已初始化静态全局int型变量k3 :0x20000008 已初始化静态局部int型变量m1 :0x20000010 常量区地址 已初始化局部char型指针变量var1:0x08000230 已初始化局部char型指针变量var2:0x08000238 代码区地址 程序代码区main函数入口地址 :0x08000145 3.实验结果分析
(四)总结 通过在不同平台进行编程验证C程序编译后在内存的地址分配,我更加深入地了解了不同变量及代码在内存中地址分配的不同,同时对于不同平台的C程序的内存分配也有了更加清晰的认识。由于作者水平有限,文中难免有疏漏之处,希望读者批评指正。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:26 , Processed in 1.176337 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号