簡體   English   中英

在C中打印char數組會導致分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM