内存如何分配给不同数据类型的变量?

我写了以下代码。

#include int main() { int x = 1 ; int *j = &x ; int y = 2 ; int *t = &y ; printf("%p\n" , (void *)j); printf("%p" , (void *)t); } 

输出为0028FF14 0028FF10

我要说的是,地址之间的差异是“4”。

而在这种情况下

 #include int main() { char x = 't' ; char *j = &x ; char y = 'f' ; char *t = &y ; printf("%p\n" , (void *)j); printf("%p" , (void *)t); } 

输出为0028FF17 0028FF16

差异是1

第一种情况的差异是4 。 而在第二种情况下它是1 。 为什么会这样?

如果我单独在所有内存地址打印值,我会得到什么?

也许这是非常普遍和已知的,但我刚开始使用C,所以程序的输出让我很困惑。

更新
现在使用%p格式并将指针值转换为void*以按照Keith Thompson的建议打印指针值。

对于在内存中布置声明对象的顺序没有要求。 显然,您正在使用的编译器恰好将xy放在一起。 它本可以在它们之间放置j ,但事实并非如此。

此外,打印指针值的正确方法是使用%p格式并将指针值转换为void*

 printf("%p\n", (void*)j); printf("%p\n", (void*)t); 

这产生了指针值的实现定义的人类可读表示,通常但不总是hex。

如果你关心在内存中分配声明变量的顺序,你可能做错了什么,或者至少没用。 让编译器担心放东西的位置。 它知道它在做什么。

对于初学者而言,差异并不总是四个,恰好是幸运巧合恰好是四个。 允许编译器将变量粘贴到内存中。 在这种情况下,它将两个变量放在内存中,并且差异可以解释为系统中的整数大小(4个字节)以及系统中的字符大小(1个字节)。 在其他系统上,它们可以是不同的尺寸并放置在不同的位置。

每个整数占用四个字节,因此,每个整数存储器地址偏移4.一个char只占用一个字节,因此其存储器地址偏移一个。