今天同事問我一個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+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm
C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm
1.工作流程:
main()的棧中分配了數組a的空間,從高地址到低地址依次是a[9],a[8],a[7], …,a[1],a[0]。然後在更低的棧中分配了4個字節(假設地址占4個字節),存放的內容是數組a的地址,然後將其作為test()的實參。test()函數從main()的棧中把存放數組a的地址的內容改成”123\0”的地址,然後函數返回main(),打印出最後的結果。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/102918p2.htm