菜单开关

周梦康 发表于 2017-09-17 948 次浏览 标签 : C语言快速入门

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

前言

在上课 https://mengkang.net/987.html 中,我们在内存中申请了三个变量,这节课我们一起分析下它们在内存中的分布。

而我们习惯用16进制来表示内存地址,我当前电脑为64位的,所以内存的地址空间范围为64个0~64个1的跨度,但是我们只用48位,用十六进制表示就是

0x000000000000
0xffffffffffff

为什么64位机指针只用48个位?

https://www.zhihu.com/question/28638698
https://stackoverflow.com/questions/6716946/why-do-64-bit-systems-have-only-a-48-bit-address-space

代码完善test2.c

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i = 2;
    int j = 3;
    
    int sum = i + j;

    printf("%d\n", sum);

    // 增加内存输出测试
    printf("i addr is: %p\n",&i);
    printf("j addr is: %p\n",&j);
    printf("sum addr is: %p\n",&sum);

    return 0;
}

编译运行

zhoumengkang@bogon:~/Downloads$ gcc test2.c -o test2
zhoumengkang@bogon:~/Downloads$ ./test2
5
i addr is: 0x7fff5ab02adc
j addr is: 0x7fff5ab02ad8
sum addr is: 0x7fff5ab02ad4

我们可以通过sizeof来查看每个变量占用的内存大小

printf("i size\t%lu",sizeof(i)); // 4

由此可见i,j,sum的地址是连续的,而且是先分配的地址的值更大。
栈的内存分布就是自上而下的。
先到这里。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表