我有一个问题而不是一个问题(女巫可能会出现一个记忆问题)..我写了这个简单的程序:
#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变量,然后将它们与多功能相乘:
获得结果后,它会在内存中显示每个变量的位置(c
,x
,y
和z
)。
我测试了这个简单的例子,结果(在我的例子中):
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
,y
,z
具有已关闭的内存地址(22936xx),即在此处声明的变量c多功能有不同的地址(22935xx)。
查看x
,y
和z
变量,我们可以看到每两个变量之间存在4个字节的差异(即:&x-&y=4
,{{ 1}})。
我的问题是,为什么每两个变量之间的差异等于4?
答案 0 :(得分:5)
x
,y
和z
是将在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个字节。每个存储器地址对应一个字节,因此每个局部变量的地址之间存在差异。