2015-02-07 46 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

相关问题