###### tags: `blog`, `programming-note` 字串(字元陣列 char str[])與字元指標(char* str)的關係 === ```C #include <stdio.h> int main(){ char* str = NULL; gets(str); printf("%s\n", str); return 0; } ``` 這樣的程式碼在編譯時是沒有問題的, 但在執行的時候,輸入完字串就會出現以下錯誤並結束程式: > Segment fault (core dumped) 為什麼呢?不是說在 C 裡面,字串是字元陣列,且陣列名稱代表指向陣列的指標嗎? 其實仔細想想,`char*` 是個指向字元的指標,`char* str = "hello, world"` 之所以可行,是因為它指向的是 `hello, world` 這個 literal 的關係。 [這篇文章](https://www.cnblogs.com/oomusou/archive/2007/03/04/663234.html)裡面提到, `char str[] = "hello, world"` 與 `char* str = "hello, world"` 所代表的意義是不一樣的,前者是個陣列,後者則如前述所說,是個指向 literal 的指標。 因此,前述程式碼應改成: ```C #include <stdio.h> int main(){ char str[MAX_SIZE]; gets(str); printf("%s\n", str); return 0; } ``` 並注意輸入的字串長度不能超過 `MAX_SIZE`。 其實超過了也還是可以繼續執行,但在程式結束時會有以下錯誤情況: > *** stack smashing detected *** > Aborted (core dumped) [根據這篇文章](https://blog.csdn.net/haidonglin/article/details/53672208), > An input of string greater than size 10 causes corruption of gcc inbuilt protection canary variable followed by SIGABRT to terminate the program.You can disable this protection of gcc using option 即:stack smashing 是 GCC 的一种检测 “缓存溢出” 的保护机制.当分配的内存不够时,会继续执行;但是在程序结束返回时才出现错误提示 其原因為拜訪陣列時超過了陣列的合法長度,但程式會幫你延長,在結束執行時才告訴你錯誤。 --- 如果你喜歡這篇文章,請按照程度替我按 1~5 個讚! 歡迎加入讚賞公民的行列!不需要花費任何金錢,只要你辦個帳號就可以按讚了! <iframe width=100% height=200px scrolling="no" frameborder="0" src="https://button.like.co/in/embed/karasu_10969/button?referrer=https://hackmd.io/@karasu/string-and-pointer-in-c"></iframe>