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

为何不同C函数中的参数&ca与&pa内存地址完全相同?

为什么不同C函数的参数地址会相同?

问题代码

#include <stdio.h>

//char arr[]={'c', 'a', 't'};

void print(char ca[])
{
    printf("&ca=%p, &ca[0]=%p, &ca[1]=%p, ", &ca, &ca[0], &ca[1]);
    printf("++ca=%p\n",++ca);
    printf("*ca=%c\n",*ca);
}

void print2(const char *pa)
{
    printf("&pa=%p, &(pa[0])=%p, &(pa[1])=%p, ", &pa, &(pa[0]), &(pa[1]));
    printf("++pa=%p\n",++pa);
    printf("*pa=%c\n",*pa);
}

int main(void)
{
    char arr[]={'c', 'a', 't'};
    char *ptr="cat";
    printf("&arr=%p, &(arr[0])=%p, &(arr[1])=%p\n", &arr, &(arr[0]), &(arr[1]));
    print(arr);
    print2(ptr);
}

运行输出

&arr=0x7fff1ae0d755, &(arr[0])=0x7fff1ae0d755, &(arr[1])=0x7fff1ae0d756
&ca=0x7fff1ae0d728, &ca[0]=0x7fff1ae0d755, &ca[1]=0x7fff1ae0d756, ++ca=0x7fff1ae0d756
*ca=a
&pa=0x7fff1ae0d728, &(pa[0])=0x5579970a706c, &(pa[1])=0x5579970a706d, ++pa=0x5579970a706d
*pa=a

原因解释

  • C语言中函数的参数存储在栈内存中。当调用print函数时,参数ca会被分配到栈的某个位置(比如输出中的0x7fff1ae0d728)。
  • 当print函数执行完毕返回main后,它占用的栈帧会被标记为可用空间,系统不会立即清理这块内存,只是不再保留它的使用权。
  • 紧接着调用print2函数时,编译器/操作系统会复用这块刚刚被释放的栈空间,用来存放print2的参数pa,所以&pa和之前的&ca地址完全相同。
  • 要注意区分两个概念:参数变量自身的地址(&ca、&pa)是它们在栈上的存储位置,而参数指向的地址(&ca[0]、&pa[0])是实际数据的存放地址,这两者没有关联。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:13:15