为何不同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
相关产品推荐
相关产品推荐

