今天同事问我一个C程序code.c,代码如下:
#include <stdio.h>
int test(char *b)
{
b = "123\0";
return 1;
}
int main()
{
char a[10];
test(a);
printf("a[] = %s\n", a);
return 1;
}
同事的目的是给数组a赋值一个常量字符数组,但程序打印后显示乱码。旁边的同事以C语言的语义来解释这段代码出现该问题的原因,如给test()传递的参数是a的一个拷贝,test()内部不会改变a的值等等。同事的观点是对的,但这段代码确实值得我们仔细探讨下。
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
C++11 获取系统时间库函数 time since epoch
C++11中正则表达式测试
1.工作流程:
main()的栈中分配了数组a的空间,从高地址到低地址依次是a[9],a[8],a[7], …,a[1],a[0]。然后在更低的栈中分配了4个字节(假设地址占4个字节),存放的内容是数组a的地址,然后将其作为test()的实参。test()函数从main()的栈中把存放数组a的地址的内容改成”123\0”的地址,然后函数返回main(),打印出最后的结果。