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

时间:2016-01-13 18:28:21

标签: c pointers allocation memory-address

我写了以下代码。

#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&#39;。

而在这种情况下

#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的建议打印指针值。

3 个答案:

答案 0 :(得分:3)

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

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

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

这产生了一个实现定义的指针值的人类可读表示,通常但不总是十六进制。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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