[英]Printing char array in C causes segmentation fault
我為此進行了很多搜索,找不到與相同問題完全相同的任何問題。
這是我的代碼:
void fun(char* name){
printf("%s",name);
}
char name[6];
sscanf(input,"RECTANGLE_SEARCH(%6[A-Za-z0-9])",name)
printf("%s",name);
fun(name);
該名稱是從scanf
抓取的,起初打印得很好。 然后,當調用fun
時,嘗試打印名稱時會出現分段錯誤。 為什么是這樣?
看着我的玻璃杯后,我知道了:
您的scanf
確實溢出了緩沖區(包括終止符讀取在內,超過6個字節),由於某些情況,不良影響會稍有延遲:
最初沒有人依賴或重復使用損壞的內存,因此第一個printf
似乎可以正常工作。
在第一次調用printf
之后和第二次調用printf
之前的某個地方,重復使用了您覆蓋的空間,因此,在遇到未分配的頁面之前,您讀取的字符串不再終止。
因此,最終出現了分段錯誤。
當然,您的程序是在緩沖區溢出的那一刻敬酒的,而不是在它最終崩潰時敬酒。
士氣:切勿將您不曾為此專用的內容寫入內存。
查看您的編輯,格式%6[A-Za-z0-9]
嘗試讀取最多6個字符(不包括終結符),不包括終結符!
由於您要讀取6個字符,因此必須將name
聲明為7個字符,因此終止的空字符還有空間:
char name[7];
否則,將導致緩沖區溢出,並且后果是不確定的。 一旦產生不確定的后果,任何事情都可能發生,包括兩次成功調用printf()
然后在調用另一個函數時出現段錯誤。
您確定name
以零字節結尾嗎? scanf
可能會根據您的調用方式使緩沖區溢出。
如果發生這種情況,則printf
將讀取數組末尾以外的內容,從而導致未定義的行為以及可能的分段錯誤。
您可能正在使用printf語句離開數組的結尾。 Printf使用終止的空字符'\\ 0'來知道字符串的結尾在哪里。 嘗試像這樣分配數組:
char name[6] = {'\0'};
這將為數組分配初始設置為'\\ 0'字符的每個元素,這意味着只要您不用scanf覆蓋整個數組,printf就會終止,然后結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.