函数参数顺序不同为何导致参数变量内存地址输出不一致?
问题解答
你的理解确实存在偏差,核心原因是混淆了形参变量本身的地址和形参存储的实参地址,以下是具体解释:
针对你的疑问逐一说明:
函数参数的位置不同会导致值发生变化吗?
不会改变实参的值,也不会改变形参存储的实参地址值,但会改变形参变量在栈中的存储位置。你代码中打印的&list是形参list这个局部变量的地址,而非它存储的input的地址。如果打印list本身,会发现两个函数的list值完全相同(都是input的地址)。为何仅参数顺序不同的函数会产生不同结果?
函数调用时,编译器会为每个函数的栈帧分配空间,形参作为局部变量会被放置在栈帧的特定位置。参数顺序不同,会导致形参在栈帧中的排列顺序变化:- 对于
sum2(float *list, int n),栈帧中先为list分配空间,再为n分配; - 对于
sum3(int n, float *list),栈帧中先为n分配空间,再为list分配;
因此list这个形参变量的地址会因为排列顺序的差异而不同,这是编译器栈帧布局的正常行为。
- 对于
验证代码
你可以修改代码打印list的值,就能看到实参地址是一致的:
#include <stdio.h> #define MAX_SIZE 100 void sum2(float *list, int n); void sum3(int n, float *list); float input[MAX_SIZE]; int main(void){ printf(" sum2(input, MAX_SIZE) \n"); sum2(input, MAX_SIZE); printf(" sum3(MAX_SIZE, input) \n"); sum3(MAX_SIZE, input); } void sum2(float *list, int n) { printf("list(input的地址)\t= %p\n", list); printf("&list(形参的地址)\t= %p\n\n", &list); } void sum3(int n, float *list){ printf("list(input的地址)\t= %p\n", list); printf("&list(形参的地址)\t= %p\n\n", &list); }
运行后会发现两个函数的list值完全相同,而&list的地址不同,这就验证了上述结论。
内容的提问来源于stack exchange,提问作者SHU
相关产品推荐
相关产品推荐

