实验代码之locte.c

本章实验代码是访问数据区、代码区、栈区和堆区的地址以及输出其(unsigned long )类型的地址。代码区即程序编译后执行代码的部分。
其中char big_array[1L<<24]、char huge_array[1L<<30]是全局变量,属于数据区内容;p1、p2、p3、p4四个指针存在于栈中,但是它们的内容都在数据区;而exit、malloc属于堆区。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

static void show_pointer(void *p, char *descr) {
    //    printf("Pointer for %s at %p\n", descr, p);
    printf("%s\t%p\t%lu\n", descr, p, (unsigned long) 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;
}

以下是结果部分:

big array	0x55aed5d0e040	94209399906368
huge array	0x55ae95d0e040	94208326164544
local	0x7ffe50720304	140730248069892
global	0x55ae95d0e024	94208326164516
p1	0x7f8575c0f010	140211182956560
p2	0x55aed7df7260	94209434415712
p3	0x55aed7df7370	94209434415984
p4	0x55aed7e07380	94209434481536
useless	0x55ae95b0d74d	94208324065101
exit	0x7f8585c53120	140211451670816
malloc	0x7f8585ca7070	140211452014704

根据结果其实可以看出,local部分在机器中应该是存在于堆里的,而global在栈中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值