关于C代码中各个数据在内存中具体的存放区域,下面是APUE中所给出的信息
因本人是在是不懂在这画图,所以就借用vim弄了个不像样的东西,还是可以看懂的
------------
| | high address
|----------|
| stack |
|----------|
| | |
| V |
| |
| |
| ^ |
| | |
|----------|
| heap |
|----------|
| |
|----------|------------
| .rodata |
|----------|
| .bbs | Data area
|----------|
| .data |
|----------|------------
| | low address
|----------|
1、栈(stack)的上面存放命令行参数和环境变量.
2、堆(heap)的下Data区
3、Data区下面是正文段(这是由CPU执行的机器指令部分)
一般数据就放在堆栈和Data区
stack区存放局部变量,只在程序运行时出现,空间由编译器自动分配和回收
heap区存放malloc分配的数据,只在程序运行时出现,空间一般由程序员分配和回收,如果有操作系统,而且程序没有free,操作系统可能在程序结束后收回内存
.radata (文字常量区), 存放常量和字符串都放在这里, 这里的数据不可更改,为只读数据
.bbs(未初始化静态变量区), 存放没有初始化的全局变量和静态变量, 不具有初值,在程序运行前不占储存器空间
.data(已初始化静态常量区) , 存放初始化的全局变量和静态常量,具有初值,程序运行前占储存器空间
一下是以为牛人给过的分析:
int a = 0; /* .data */
static int b = 20; /* .data */
char *p1; /* .bbs */
const int A = 10; /* .rodata */
int main (int argc, char **argv)
{
int b; /* stack*/
char s[] = "abc"; /* stack */
char *p2; /* stack */
static int c = 0; /* .data */
char *p3 = "12345"; /* p3 on stack, "12345" on .rodata */
p1 = (char *)malloc(10); /* the 10 and 20 bytes by malloc on stack */
p2 = (char *)malloc(20);
strcpy(p1, "12345"); /* "12345" on .rodata */