关于C中可变内存地址的观察

时间:2010-12-08 18:42:44

标签: c memory-address

我有一个问题而不是一个问题(女巫可能会出现一个记忆问题)..我写了这个简单的程序:

#include <stdio.h>
#include <stdlib.h>

int multi(int x, int y);


int main(){
    int x;
    int y;
    printf("Enter the first number x: \n");
    scanf("%d",&x);
    printf("Enter the second number y: \n");
    scanf("%d",&y);
    int z=multi(x,y);
    printf("The Result of the multiplication is : %d\n",z,"\n");
    printf("The Memory adresse of x is : %d\n",&x);
    printf("The Memory adresse of y is : %d\n",&y);
    printf("The Memory adresse of z is : %d\n",&z);
    getchar();
    return 0;
}

int multi(int x,int y){
    int c=x*y;
    printf("The Memory adresse of c is : %d\n",&c);
    return c;  
}

正如您所看到的(如果您使用C开发),此程序输入2个int变量,然后将它们与多功能相乘:

获得结果后,它会在内存中显示每个变量的位置(cxyz)。

我测试了这个简单的例子,结果(在我的例子中):

The Memory adresse of c is : 2293556  
The Result of the multiplication is : 12  
The Memory adresse of x is : 2293620  
The Memory adresse of y is : 2293616  
The Memory adresse of z is : 2293612  

正如您所看到的,在main函数中声明的三个变量xyz具有已关闭的内存地址(22936xx),即在此处声明的变量c多功能有不同的地址(22935xx)。

查看xyz变量,我们可以看到每两个变量之间存在4个字节的差异(即:&x-&y=4,{{ 1}})。

我的问题是,为什么每两个变量之间的差异等于4?

5 个答案:

答案 0 :(得分:5)

xyz是将在call stack上创建的整数变量(但请参见下文)。 sizeof int是4个字节,因此编译器将在堆栈上为这些变量分配多少空间。这些变量彼此相邻,因此它们相隔4个字节。

您可以通过查找有关calling conventions的信息来了解如何为局部变量分配内存。

在某些情况下(不使用address-of运算符),编译器可能会将局部变量优化为寄存器。

答案 1 :(得分:4)

在您的情况下,三个变量分配在连续的内存块中。在x86系统上,int类型为32位宽,即sizeof(int) == 4。因此每个变量与最后一个变量相距4个字节。

答案 2 :(得分:2)

机器上的机器字大小为4个字节,因此,对于程序访问速度,它们会在4字节边界上偏移每个变量。

答案 3 :(得分:2)

在“堆栈”上分配局部变量。通常,编译器会将它们按顺序排列,因为实际上没有理由不这样做。 C中的整数是4个字节。因此,y之后的x有4个字节,而z之后的y有4个字节,这是有意义的。

答案 4 :(得分:2)

您似乎在32位计算机上运行。每个int的大小为32位,一个字节为8位,int的大小为4个字节。每个存储器地址对应一个字节,因此每个局部变量的地址之间存在差异。