LOCATE
实验目的
模拟计算机不要命一样分配空间 展示数据和函数在内存中的存储位置,同时也可验证数据对齐原则。
代码总览
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
static void show_pointer(void *p, char *descr)
{
printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p);
}
char big_array[1L<<24];
char huge_array[1L<<30];
int global = 0;
int useless() { return 0; }
int main ()
{
void *p1, *p2, *p3, *p4;
int local = 0;
p1 = malloc(1L << 28);
p2 = malloc(1L << 8);
p3 = malloc(1L << 16);
p4 = malloc(1L << 8);
show_pointer((void *) big_array, "big array");
show_pointer((void *) huge_array, "huge array");
show_pointer((void *) &local, "local");
show_pointer((void *) &global, "global");
show_pointer((void *) p1, "p1");
show_pointer((void *) p2, "p2");
show_pointer((void *) p3, "p3");
show_pointer((void *) p4, "p4");
show_pointer((void *) useless, "useless");
show_pointer((void *) exit, "exit");
show_pointer((void *) malloc, "malloc");
return 0;
}
代码分析
头文件
- 头文件中
#include <unistd.h>
:
unistd.h是unix std的意思,是POSIX标准定义的unix类系统定义符号常量的头文件,在Linux下开发的C程序都需要头文件unistd.h。
函数show_pointer
- 函数
show_pointer
,目的是输出指针的位置,即分配空间的首地址。
static void show_pointer(void *p, char *descr)
{
printf("%s\t%p\t%lu\n", descr, p, (unsigned long) p);
}
全局变量
- 分别定义了超大数组,整型常量,函数,计算机为此分配对应大小的空间。
char big_array[1L<<24];
char huge_array[1L<<30];
int global = 0;
int useless() { return 0; }
主函数
- 定义了四个指针及一个整型局部常量,计算机再次为它们分配空间。
int main ()
{
void *p1, *p2, *p3, *p4;
int local = 0;
p1 = malloc(1L << 28);
p2 = malloc(1L << 8);
p3 = malloc(1L << 16);
p4 = malloc(1L << 8);
show_pointer((void *) big_array, "big array");
show_pointer((void *) huge_array, "huge array");
show_pointer((void *) &local, "local");
show_pointer((void *) &global, "global");
show_pointer((void *) p1, "p1");
show_pointer((void *) p2, "p2");
show_pointer((void *) p3, "p3");
show_pointer((void *) p4, "p4");
show_pointer((void *) useless, "useless");
show_pointer((void *) exit, "exit");
show_pointer((void *) malloc, "malloc");
return 0;
}
编译运行
结果分析
建议您循环多次以上过程,可得计算机内存大小 可以看出不同类型的数据有不同的存储区域。静态分配的数据,比如说全局变量,静态变量会放在数据一块里;局部变量保存在运行时栈里;动态内存的分配会在堆中处理。大体如下图(图源不周山):