歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中函數體內對外部字符指針賦值

今天同事問我一個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

Copyright © Linux教程網 All Rights Reserved