歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言中函數體內對外部字符指針賦值

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

日期:2017/3/1 9:43:21   编辑:Linux編程

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