|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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天 |
|