很有意思的一个c程序
#include "stdio.h"
fun1(char ca[]);
fun2(char *pa);
char ga[4]={'a','b','c','d'};
main()
{
fun1(ga);
fun2(ga);
printf("%p %p %p\n",&ga,&(ga[0]),&(ga[1]));
}
fun1(char ca[])
{
printf("%p %p %p\n",&ca,&(ca[0]),&(ca[1]));
}
fun2(char *pa)
{
printf("%p %p %p\n",&pa,&(pa[0]),&(pa[1]));
}
先猜一下结果,再编译运行一下。
[解决办法]
ca是一个局部变量,&ca是局部变量的地址,pa也一样
两个变量都指向ga
#include "stdio.h"
fun1(char ca[]);
fun2(char *pa);
char ga[4]={'a','b','c','d'};
main()
{
fun1(ga);
fun2(ga);
printf("%p %p %p\n",ga,&(ga[0]),&(ga[1]));
}
fun1(char ca[])
{
printf("%p %p %p\n",ca,&(ca[0]),&(ca[1]));
}
fun2(char *pa)
{
printf("%p %p %p\n",pa,&(pa[0]),&(pa[1]));
}
看上面我改后的代码就对了,改后的输出为:
0x601020 0x601020 0x601021
0x601020 0x601020 0x601021
0x601020 0x601020 0x601021
不明白为什么的话多查查资料
[解决办法]
ca,pa都是两个局部变量,局部变量是分配在栈上的,main调用func1,在栈上分配局部变量ca,执行完func1,清空栈,然后调用func2,在栈上分配局部变量pa,执行func2,所以&ca和&pa是相等的。