locate-计算机学习日志

这篇博客通过LOCATE实验,详细介绍了模拟计算机内存分配的过程,展示了数据和函数在内存中的存储位置,探讨了数据对齐原则。内容涵盖实验目的、代码总览、代码分析(包括头文件、show_pointer函数、全局变量和主函数)、编译运行及结果分析,揭示了不同类型的变量在内存中的不同存储区域。
摘要由CSDN通过智能技术生成

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);
    // printf("Pointer for %s at %p\n", descr, p);
}

全局变量

  • 分别定义了超大数组,整型常量,函数,计算机为此分配对应大小的空间。
char big_array[1L<<24];/*  16 MB */
//char huge_array[1L<<31];/*   2 GB */
char huge_array[1L<<30];/*   1 GB */
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 << 32);
    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;
}

编译运行

在这里插入图片描述

结果分析

  • 建议您循环多次以上过程,可得计算机内存大小 可以看出不同类型的数据有不同的存储区域。静态分配的数据,比如说全局变量,静态变量会放在数据一块里;局部变量保存在运行时栈里;动态内存的分配会在堆中处理。大体如下图(图源不周山):
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值