C语言 内存布局2
执行结果截图:
可以将执行结果截图比对如下的内存布局表(注意:执行结果截图中地址绝对值小的,反而要当作表里的高地址来看,原因待探讨):
代码:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
// 全局变量a在全局初始化区,低地址。
int a = 0;
// 全局变量p1在全局未初始化区(BSS段),低地址。
// 数据段包括初始化的数据和未初始化的数据(BSS)两部分。
char * p1;
int main()
{
int i;
// 局部变量b在栈,高地址
int b = 784;
// 因为固定数组s[]是在函数内声明,所以在栈,高地址。
char s[] = "abc";
// 局部变量p2在栈,高地址
char * p2 = NULL;
// 局部变量p3在栈, 高地址。字符串常量123456在文字常量区,低地址。
// 编译器可能会将字符串常量123456与p3所指向的"123456"优化成一个地方(低地址)。
char * p3 = "123456";
// 静态变量c在全局(静态)初始化区,在数据段(即static区), 低地址。
// 全局变量和静态变量的存储是放在一块的,其中初始化的在一块区域,而未初始化的在相邻的另一块区域。
// 疑问: 为何已经初始化为非零的静态局部变量c的地址比未初始化的全局变量p1高?
// 疑问: 或者说,BSS段的地址未必高于数据段的地址吗?
static int c = 253;
printf("Before p1 initialization, &p1: %p, ", &p1);
if(NULL == p1)
{
printf("p1: NULL\n");
}
else
{
printf("p1: %p\n", p1);
}
// 申请的10个字节和20个字节的动态内存区域在堆区,相对于栈区是低地址。
printf("Applying dynamic memory space for p1...\n");
p1 = (char *)malloc(10 * sizeof(char));
if (NULL == p1)
{
exit(1);
}
printf("Dynamic memory space for p1 is successfully applied.\n");
printf("Before p2 initialization, &p2: %p, ", &p2);
if(NULL == p2)
{
printf("p2: NULL\n");
}
else
{
printf("p2: %p\n", p2);
}
printf("Applying dynamic memory space for p2...\n");
p2 = (char *)malloc(20 * sizeof(char));
if (NULL == p2)
{
exit(1);
}
printf("Dynamic memory space for p2 is successfully applied.\n");
strcpy(p1, "123456");
printf("p1[10] is partially initialized.\n");
strcpy(p2, "abc");
printf("p2[20] is partially initialized.\n");
printf("&a: %p, a: %d\n", &a, a);
printf("&b: %p, b: %d\n", &b, b);
printf("&s: %p, s: %p, s[]: %s\n", &s, s, s);
printf("&c: %p, c: %d\n", &c, c);
printf("&p2: %p, p2: %p, p2[]: ",&p2, p2);
for (i = 0; i < 20; i++)
{
printf("%c", p2[i]);
}
putchar('\n');
printf("&p1: %p, p1: %p,\n", &p1, p1);
for (i = 0; i < 10; i++)
{
printf("p1[%d] = %p -> %c\n", i, &p1[i], p1[i]);
}
putchar('\n');
printf("&p3: %p, p3: %p, p3[]: %s\n", &p3, p3, p3);
free(p1);
free(p2);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】