You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数参数顺序不同为何导致参数变量内存地址输出不一致?

问题解答

你的理解确实存在偏差,核心原因是混淆了形参变量本身的地址和形参存储的实参地址,以下是具体解释:

针对你的疑问逐一说明:

  1. 函数参数的位置不同会导致值发生变化吗?
    不会改变实参的值,也不会改变形参存储的实参地址值,但会改变形参变量在栈中的存储位置。你代码中打印的&list是形参list这个局部变量的地址,而非它存储的input的地址。如果打印list本身,会发现两个函数的list值完全相同(都是input的地址)。

  2. 为何仅参数顺序不同的函数会产生不同结果?
    函数调用时,编译器会为每个函数的栈帧分配空间,形参作为局部变量会被放置在栈帧的特定位置。参数顺序不同,会导致形参在栈帧中的排列顺序变化:

    • 对于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:38:14