今天敲了一段代碼,遇到了從鍵盤輸入多個字符串到指針數組的問題,在程序執行的時候出現了段錯誤的提示。本文主要涉及到了以下知識:
- 數據的存儲
- 數組和指針
1.字符串常量的存儲
c語言中字符串常量存儲在靜態數據區,並且有字符串結束符,直到程序運行結束它才會被銷毀,所以在程序中我們把一個字符串常量賦值給一個字符指針,如:
char *pChar = "Hello World!";
其中,”Hello World!”是一個字符串常量,pChar是一個字符指針。該句相當於將字符’H’在靜態數據區中的地址賦給pChar。此時,字符串常量”Hello World!”只有一份存儲在靜態數據區。
另外一種常見的類型是將一個字符串常量賦值給一個字符數組,而其余上面的指針形式有本質上的區別,如下:
char str[] = "Hello World!";
其中,”Hello World!”是一個字符串常量,str是一個字符數組。此時,程序會將字符串常量”Hello World!”拷貝一份到棧區(如果str是局部變量),從此將於字符串常量”Hello World!”再無聯系。
2.從鍵盤輸入字符串
從上面可以看出,我們可以給一個字符指針賦一個字符串常量,因為字符串常量在內存中真實存在且有其地址。而從鍵盤輸入則不然,我們必須先分配一些空間用來存儲鍵盤輸入的字符串,例如:
char* str = (char*)malloc(sizeof(char) * 100); scanf("%s", str);
這樣我們輸入的字符串就會存儲在str所指向的動態空間內。對指針數組的賦值參考以上即可。