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


比较下两段程序的输出

#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等位置上。

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





你可能感兴趣的:(C语言)