2014-10-31 101 views
-5
#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    char *p; 
    p=malloc(1); 
    scanf("%s",p); 
    printf("%s",p); 
    free(p); 
} 

該代碼只需要27個字符之後出現分段錯誤。可以有人解釋malloc(1)的這種奇怪行爲嗎?無法理解Malloc輸出

+1

我根本不覺得奇怪。你期望發生什麼?你認爲'malloc(1)'做了什麼? – 2014-10-31 17:30:13

+1

@ 1336087:即使只有一個字符是[未定義行爲](http://en.wikipedia.org/wiki/Undefined_behavior)。必須有'scanf'來添加空終止符。 – 2014-10-31 17:42:24

+0

@FredLarson:是的,OP應該分配至少2個字節。並使用'scanf(「%1s」,p);'或'fgets()'。 – user1336087 2014-10-31 17:44:46

回答

4

你只分配一個字節。在你的例子中的第一個字節之後的任何一點,segfault都是公平的遊戲。它恰好是你27字節。它每次運行程序的時間可能會有所不同

編輯: 如果你的意思是隻分配了一個告別讀取單個字符,改變你的功能:

scanf(" %c", p); 
printf("%c", p); 

領先的空間在前面在scanf上的字符說明符是欺騙scanf忽略它可能試圖分配給你的緩衝區的任何空格(如果有的話)