C语言学习笔记之奇怪的地址问题

来源:互联网 发布:淘宝宝贝怎么靠前 编辑:程序博客网 时间:2024/06/08 00:11


比较下两段程序的输出

#include <stdio.h>int main(){    char c = 'A';    int a = 10;         printf("a=%p\n", &a);    printf("c=%p\n", &c);       return 0;}
输出:
a=0x7fff5e706c64
c=0x7fff5e706c6b
这里相差7字节

#include <stdio.h>int main(){    int a = 10;    char c = 'A';     printf("a=%p\n", &a);    printf("c=%p\n", &c);       return 0;}
输出:

a=0x7fff5de52c68
c=0x7fff5de52c67
这里相差1 字节

---------解答--------

这个要涉及到内存对齐了。简单来说,就是为了放置变量的二次访问。操作系统在访问内存时,每次读取一定的长度(64位系统默认为8字节)。
分析下这两种情况:
no.1、定义的char类型得到内存空间地址是0x7fff5e706c6b,如果不对齐的话,那么分配后面int类型变量的空间就是0x7fff5e706c6a--0x7fff5e706c67这四个字节空间了,那么要读取int型变量就会先读取0x7fff5e706c60--0x7fff5e706c67空间的内容,再读取0x7fff5e706c68--0x7fff5e706c6f空间的内容才能得到int类型变量的值,这就是二次读取了。而使用内存对齐来避免二次读取,将后面的int类型变量空间分配到0x7fff5e706c60--0x7fff5e706c67空间就可以避免,int类型占用4字节空间,即0x7fff5e706c67--0x7fff5e706c64.于是就有了这个结果。
no.2、这个就简单了,int类型变量分配到空间0x7fff5de52c68,系统读取0x7fff5e706c68--0x7fff5e706c6f空间内容,一次性获得int型变量的值;后来的char类型分配的空间0x7fff5de52c67,系统读取0x7fff5e706c60--0x7fff5e706c67空间内容,也是一次性读取获得值。

内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”
例如int类型占用4个字节,地址只能在0,4,8等位置上。

(以上是一个同学的解答,我觉得是正确的





0 0
原创粉丝点击