在C语言中程序代码存在内存中的哪个区?
在C/C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
那程序代码存在哪个区?
一个由C/C++编译的程序占用的内存分为以下几个部分 栈区,堆区,全局区,文字常量区,程序代码区
怎么一会这样一会又那样.
前面说的五个区中为什么没有程序代码区?一直想不通,望高手指点迷津!
[解决办法]
第一种说法:堆区和自由区是同一个地方
第二种说法:文字常量区和程序代码区是同一个地方
来个示例代码吧
- C/C++ code
#include <stdio.h>#include <stdlib.h>int a = 1234; //全局区int main(){ char *b = "Hello!~~"; //指针指向代码区,b变量本身也在栈区 int c = 5678; //栈区 int *d = (int*)malloc( sizeof(int) ); //指针指向堆区,d变量本身同样在栈区 *d = 9999; static char e = 0; //全局区 static int (*f)() = main; //指向代码区,f本身在全局区 printf( "&a = %08x, a = %d\n", &a, a ); printf( " b = %08x, b = %s, &b = %08x\n", b, b, &b ); printf( "&c = %08x, c = %d\n", &c, c ); printf( " d = %08x, *d = %d, &d = %08x\n", &d, *d, &d ); printf( "&e = %08x, e = %d\n", &e, e ); printf( "&f = %08x, f = %d\n", &f, f ); printf( "&main = %08x, main = %d\n", &main, main ); return 0;}
[解决办法]
唉,都说了不用在意那些名字,真要较真的话,分配大内存的时候根本不会涉及到堆
至少Windows在分配较大内存的时候(通常1MB以上),即便你使用malloc,分配的空间也不是堆,而是调用VirtualAlloc直接调拨的页内存(粒度4KB),因为分配大内存,根本不需要堆这种细粒度(可精确到1字节)的数据结构,徒然降低效率而已
[解决办法]
建议楼主看一下 《C专家编程》
从C语言的角度来看,对于内存的一些处理和编译器还是有关系的
所以不同的平台也是有差别的
WINDOWS下和嵌入式肯定也不一样,毕竟关注点不同
其实,对于一般开发而言
只要了解堆内存,栈内存,全局变量静态内存的区别的就可以
关键还要知道这些内存使用对于编程的影响
比如堆内存的及时回收避免内存泄漏
栈内存不要过渡使用以免造成栈溢出
全局变量静态变量如果做了初始化那么其占用空间将导致编译出来的目标文件增大等等
这些细节的东西多是嵌入式需要考虑的
windows下可能不必考虑那么细致
不知道是否能帮到楼主