2

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

#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 变量,然后将它们与 multi 函数相乘:

得到结果后,它会显示每个变量在内存中的位置(、cx)。yz

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

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 函数中声明的三个变量,x具有封闭的内存地址 (22936xx),在 multi 函数中声明的变量 c 具有不同的地址 (22935xx)。yz

查看x,yz变量,我们可以看到每两个变量(即 : &x-&y=4, &y-&z=4)之间有 4 个字节的差异。

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

4

5 回答 5

5

x, y, 和z, 是将在调用堆栈上创建的整数变量(但见下文)。是 4 个字节,这sizeof int就是编译器将在堆栈上为这些变量分配多少空间。这些变量彼此相邻,因此它们相隔 4 个字节。

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

在某些情况下(不使用地址运算符),编译器可能会将局部变量优化到寄存器中。

于 2010-12-08T18:47:26.630 回答
4

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

于 2010-12-08T18:46:56.490 回答
2

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

于 2010-12-08T18:47:18.347 回答
2

您似乎在 32 位机器上运行。每个的大小int是 32 位,一个字节有 8 位,an 的大小int是 4 个字节。每个内存地址对应一个字节,所以每个局部变量的地址相差4。

于 2010-12-08T18:47:57.437 回答
2

您机器上的机器字大小为 4 字节,因此,为了提高程序的访问速度,它们会将每个变量偏移 4 字节边界。

于 2010-12-08T18:46:38.410 回答