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

How is Memory Allocated to variables of different data types?

我写了下面的代码。

#include<stdio.h>

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<stdio.h>

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);

这会生成指针值的 implementation-defined human-readable 表示,通常但不总是十六进制。

如果您关心声明的变量在内存中的分配顺序,您可能做错了什么,或者至少没有用。让编译器操心把东西放在哪里。它知道自己在做什么。

好吧,对于初学者来说,差异并不总是四,只是巧合而已。允许编译器将变量保存在内存中任何它想要的地方。在这种情况下,它已将您的两个变量放在内存中并排放置,差异可以解释为系统上的整数有多大(4 字节)和系统上的字符有多大(1 字节)。在其他系统上,它们可能有不同的大小并放置在不同的位置。

每个整数占用四个字节,因此每个整数内存地址偏移4。字符只占用一个字节,因此其内存地址偏移一个。