2015-02-07 67 views
0

我目前正在編寫一個解析來自流的輸入的測試程序。我不會詳細介紹這個程序,但我目前正在嘗試解析字母數字字符,然後將它們分配給一個臨時字符串,temp [100]。在將所有有效字符分配給temp後,我分配內存並將strncpy分配給分配的字符串變量。解決Valgrind給出的未初始化值錯誤的問題

Valgrind的抱怨我的strlen的兩種用法,我的單次使用函數strncpy的。爲什麼是這樣?它抱怨未初始化的值,但我明確表示,除非temp內有字符,否則不會進行任何分配。有什麼建議麼?

char *name(char a) 
{ 
    int x; 
    char c; 
    char *returnName = 0; 
    char temp[100]; 
    int i = 0; 

    /* Ensures no character is skipped */ 
    temp[i] = a; 
    i++; 

    /* Fill temp one character at a time */ 
    while((x = getchar()) != EOF) 
    { 
     c = (char)x; 

     /* Valid characters are assigned */ 
     if((isalnum(c)) || c == '_') 
     { 
      temp[i] = c; 
      i++; 
     } 

     /* As soon as invalid character appears, exit loop */ 
     else 
      break; 
    } 

    /* Make sure temp is not NULL before mallocing */ 
    if(temp[0] != '\0') /* Thank you Alter Mann for this fix */ 
    { 
     printf("Before malloc\n"); 
     returnName = malloc(sizeof(char)*strlen(temp)+1); 
     printf("After malloc before strncpy\n"); 
     strncpy(returnName, temp, strlen(temp)+1); 
     printf("After strncpy before return\n"); 
     return returnName; 
    } 

    /* If nothing is assigned, return NULL */ 
    return NULL; 
} 
+1

你永遠不會在'temp'中終止你的字符串。 – 2015-02-07 20:59:22

+1

哇。我不能相信我忘了那件事。我現在會這樣做,並報告回來。 – Plaidypus 2015-02-07 21:00:37

回答

1

你永遠不空值終止您在temp字符串,這樣既strlen()strcpy()正在閱讀過去初始化你的數組值,因此Valgrind給你的未初始化值錯誤。

變化:

char temp[100]; 

到:

char temp[100] = {0}; 

,你應該是不錯的。

+0

感謝您的幫助,保羅。 – Plaidypus 2015-02-07 21:12:11

1

這裏:

if(temp != NULL) 

你需要檢查

if(temp[0] != '\0') 

temp是一個數組,而不是一個指針。

而且while循環後(由保羅·格里菲思指出),NUL,終止您的字符串:

temp[i] = '\0'; 
+0

我明白了,現在我會記住這一點。保羅格里菲斯答案解決了我的問題,但我知道你的建議爲我節省了更多的麻煩。謝謝! – Plaidypus 2015-02-07 21:06:28

+0

不客氣;) – 2015-02-07 22:08:25

相關問題