2014-05-01 34 views
0

請問您可以告訴我以下輸入過程出了什麼問題?使用scanf進行char *時的內存泄漏c

輸入應該是字符串長度,然後是字符串本身。

像 「5 vlady」

它工作得很好,但是的valgrind(內存泄漏工具)跟以下異常:

地址0x51ef184是大小爲4頁頭塊後0字節」 d

她是代碼:

unsigned int n; 
char* string; 

printf("Enter your string:\n"); 
scanf("%d", &n); 
string = (char*)calloc((n),sizeof(char)); 
scanf("%s", string); 

謝謝!

回答

4

由於scanf("%s")附加了終止空字符,所以發佈的代碼正在寫入超出分配內存的一個字節。從部分描述爲格式說明s 7.19.6.2的fscanf C99標準的功能

如果沒有升長度改性劑的存在,則相應的參數應該是指向的字符陣列足夠大的初始元件接受序列和終止空字符,該字符將自動添加

因此分配n + 1字節。

其他:

  • 經常檢查IO操作的結果,以確保變量已賦值:

    /* 'scanf()' returns number of assignments made. 
        Use '%u' for reading an unsigned int. */ 
    if (scanf("%u", &n) == 1) 
    { 
    } 
    
  • 防止緩衝區限制由scanf()佔用的字節數超限使用%Ns格式說明符,其中N是要讀取的數字字符。在這種情況下,格式說明符將需要構造,例如使用sprintf()。另一種選擇是使用fgets(),但是當遇到空白時,這不會停止讀取。

  • Do I cast the result of malloc?

+0

的感謝!那讓我瘋狂 – vlady