关于C语言中可变存储地址的一个观察

关于C语言中可变存储地址的一个观察,c,memory-address,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 secon

我有一个问题,而不是一个问题(可能会产生一个记忆问题)。。我编写了这个简单的程序:

#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;  
}
如您所见,在主函数中声明的三个变量
x
y
z
具有闭合内存地址(22936xx),在多函数中声明的变量c具有不同的地址(22935xx)

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


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

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

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

局部变量分配在“堆栈”上。通常,编译器会将它们按顺序排列,因为没有理由不这样做。C中的整数是4字节。因此,
y
x
之后有4个字节,
z
y
之后有4个字节,
x
y
z
都是将在上创建的整数变量(但请参见下文)。int的
sizeof
是4个字节,因此编译器将在堆栈上为这些变量分配多少空间。这些变量彼此相邻,因此它们相隔4个字节

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


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

看起来您正在32位机器上运行。每个
int
的大小是32位,一个字节中有8位,
int
的大小是4个字节。每个内存地址对应一个字节,因此每个局部变量的地址之间的差异为4。

对齐很重要,但这里似乎不是问题。我想如果声明了3个char变量,它们应该在相同的边界上,但另一件令人惊奇的事情是,另一个函数中的c变量不在相同的边界上,它离x,y,z位置有点远,我认为它在相同的边界上。不同之处在于堆栈帧不同,因此您可以看到函数与调用者的距离很远。使用
%d
打印指针值是不正确的,除非您先将它们转换为
(int)
,这是一个坏主意。相反,请使用
%p
。谢谢,我刚刚尝试使用指针,但出现了一个强制转换错误:)但这只是针对我的机器还是世界上的每台机器?我可以得出一个结论,对于64位机器,整数的字节间隔为8字节。即使在64位机器中,大多数
int
类型也是32位的。(机器的“位”是指内存地址寄存器的大小,而不是整数的大小。)要获得64位整数,请使用
long
类型。64位机器仍然可以为
int
类型分配32位。
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