马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
//鱼C论坛——BaysideLizard写于2023年11月26日
//实验一
int global_uninit_var;
int global_init_var1 = 1;
int global_init_var2 = 2;
int *func(void);
int main()
{
int local_var1;
int local_var2;
static int static_uninit_var;
static int static_init_var = 3;
char *str1 = "abc";
char *str2 = "efg";
int *malloc_var = (int *)malloc(sizeof(int));
printf("实验一\n");
printf("addr of func -> %p\n",func);
printf("addr of str1 -> %p\n",str1);
printf("addr of str2 -> %p\n",str2);
printf("addr of global_init_var1 -> %p\n",&global_init_var1);
printf("addr of global_init_var2 -> %p\n",&global_init_var2);
printf("addr of static_init_var -> %p\n",&static_init_var);
printf("addr of static_uninit_var -> %p\n",&static_uninit_var);
printf("addr of global_uninit_var -> %p\n",&global_uninit_var);
printf("addr of malloc_var -> %p\n",malloc_var);
printf("addr of local_var1 -> %p\n",&local_var1);
printf("addr of local_var2 -> %p\n",&local_var2);
/*C语言的内存布局规律:
内存地址 低 -------> 高
函数 字符串常量 全局变量(初始化) 静态变量(初始化) 静态变量(未初始化) 全局变量(未初始化) 动态申请的变量空间 局部变量
代码段 数据段 bss段 堆 栈
代码段:存放程序执行代码
数据段:存放已经初始化的全局变量和局部静态变量
BSS(Block Started by Symbol)段:存放未初始化的全局变量,自动初始化为0
堆:手动申请与释放
栈:自动分配与释放
*/
//实验二
int *ptr = NULL;
ptr = func();
printf("\n实验二\nptr -> %d\n",*ptr);
free(ptr);
//实验三
int *ptr1 = NULL;
int *ptr2 = NULL;
ptr1 = (int *)malloc(sizeof(int));
if(ptr1 == NULL)
{
exit(1);
}
ptr2 = (int *)malloc(sizeof(int));
if(ptr2 == NULL)
{
exit(1);
}
printf("\n实验三\n");
printf("stack:&ptr1-%p | &ptr2-%p\n",&ptr1,&ptr2);
printf("heap:ptr1-%p | ptr2-%p\n",ptr1,ptr2);
ptr1 = realloc(ptr1,2 * sizeof(int));
printf("realloc ptr1 -> 2 * sizeof(int):%p\n",ptr1);
ptr1 = realloc(ptr1,20 * sizeof(int));
printf("realloc ptr1 -> 20 * sizeof(int):%p\n",ptr1);
//str1的内存地址取决于realloc的大小
return 0;
}
int *func(void)
{
int *ptr = NULL;
ptr = (int *)malloc(sizeof(int));
if(ptr == NULL)
{
exit(1);
}
*ptr = 123;
return ptr;
}
运行结果:
实验一
addr of func -> 000000000040177F
addr of str1 -> 0000000000404000
addr of str2 -> 0000000000404004
addr of global_init_var1 -> 0000000000403010
addr of global_init_var2 -> 0000000000403014
addr of static_init_var -> 0000000000403018
addr of static_uninit_var -> 0000000000407030
addr of global_uninit_var -> 0000000000407970
addr of malloc_var -> 0000000000C55E60
addr of local_var1 -> 000000000061FDFC
addr of local_var2 -> 000000000061FDF8
实验二
ptr -> 123
实验三
stack:&ptr1-000000000061FDF0 | &ptr2-000000000061FDE8
heap:ptr1-0000000000C56E90 | ptr2-0000000000C56EB0
realloc ptr1 -> 2 * sizeof(int):0000000000C56E90
realloc ptr1 -> 20 * sizeof(int):0000000000C56ED0
Process returned 0 (0x0) execution time : 0.037 s
Press any key to continue.
不过我发现了一个问题,在我的电脑上堆的地址似乎更高,这是由于编译器和操作系统的具体实现方式引起的。具体来说,当你运行程序时,操作系统会为进程分配虚拟地址空间,并将其划分为不同的区域,如代码区、数据区(包括全局变量和静态变量)、堆和栈等。
详见https://fishc.com.cn/thread-236996-1-1.html
在FishC学C的第21天 |