gpt4 book ai didi

c++ - 打印内存地址

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:55 28 4
gpt4 key购买 nike

我在 Windows8 的 Cygwin 上运行了以下程序。

#include<iostream>
#include <stdio.h>
using namespace std;
int main(){
char c1 = 'a';
char c2 = 'b';
int i1 = 1;
float l1 = 100;
float f1 = 3.14;
double d1 = 1.424;
int i2;
char c3;
int i3;
printf("&c1 -> %u\n", (unsigned long)&c1);
printf("&c2 -> %u\n", (unsigned long)&c2);
printf("&i1 -> %u\n", (unsigned long)&i1);
printf("&l1 -> %u\n", (unsigned long)&l1);
printf("&f1 -> %u\n", (unsigned long)&f1);
printf("&d1 -> %u\n", (unsigned long)&d1);
printf("&i2 -> %u\n", (unsigned long)&i2);
printf("&c3 -> %u\n", (unsigned long)&c3);
printf("&i3 -> %u\n", (unsigned long)&i3);
}

我的笔记本电脑给出了以下结果。

$ ./a.exe
&c1 -> 2337487
&c2 -> 2337486
&i1 -> 2337480
&l1 -> 2337476
&f1 -> 2337472
&d1 -> 2337464
&i2 -> 2337460
&c3 -> 2337459
&i3 -> 2337452

我理解每个数据类型都有自己的大小,根据大小占用内存地址。例如,在这种情况下,由于char类型只有1个字节大小,变量c1占用1个内存地址(2337487),下一个变量c2 是从地址2337486开始的,但是我很疑惑的是i1是从2337480开始的,如果c2也是char类型变量,它不应该只占用一个地址吗?而i1是从2337485开始的吗?

我猜这与编译器有关,但不明白它是如何工作的。谁能给我一些建议吗?

最佳答案

这是因为数据结构对齐。

例如,当计算机的字长为 4 字节时(一个字节在大多数机器上表示 8 位,但在某些系统上可能不同),要读取的数据应该位于内存偏移量,该内存偏移量是 4 的一些倍数. 当情况并非如此时,例如数据从第 14 个字节而不是第 16 个字节开始,然后计算机必须读取两个 4 字节的 block 并在读取请求的数据之前进行一些计算,否则可能会产生对齐错误。即使前一个数据结构在第 13 个字节结束,下一个数据结构也应该从第 16 个字节开始。在两个数据结构之间插入两个填充字节,使下一个数据结构与第 16 个字节对齐。

关于c++ - 打印内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com