2010-11-15 26 views
0

我试着按以下规则来分割字符串:内存泄漏问题,而用C分割字符串

  1. 话不“”,围绕他们应该单独字符串
  2. 什么室内用对待“”周围它应该被视为一个字符串

但是,当我在valgrind中运行它我得到无效的释放和无效的读取大小错误,但如果我删除两个释放我得到一个内存泄漏。如果任何人都可以在正确的方向指向我,我将不胜感激

调用split_string

char *param[5]; 
    for(i = 0;i < 5;i++) { 
      param[i] = NULL; 
    } 
    char* user = getenv("LOGNAME"); 
    char tid[9]; 
    char* instring = (char*) malloc(201); 

    /
    while((printf("%s %s >",user,gettime(tid)))&&(instring 
      =fgets(instring,201,stdin)) != NULL) { 
      int paramsize = split_string(param, instring); 

试图释放PARAM

   for(i = 0;i < 5;i++) { 
       if(param[i] != NULL) { 
        free(param[i]); 
        fprintf(stderr,"%d",i); 
       } 
      } 

int split_string(char** param, char* string) { 
    int paramplace = 0; //hvor vi er i param 
    int tempplace = 0; //hvor i temp vi er 

    char* temp = malloc(201); 
    int command = 0; 
    int message = 0; 
    for(; (*string != '\0') && (*string != 10) && paramplace < 4; string++) { 
      if((*string == ' ') && (message == 0)) { 
        if(command == 1) { 
         temp[tempplace] = '\0'; 
         param[paramplace++] = temp; 
         tempplace = 0; 
         command = 0; 
        } 
      } 
      else { 
        if(*string =='"') { 
          if(message == 0) message = 1; 
          else message = 0; 
        } 
        if(command == 0) { 
          free(temp); 
          temp = malloc(201); 
        } 
        command = 1; 
        if(*string != '"') { 
          temp[tempplace++] = *string; 
        } 
      } 
    } 
    if(command == 1) { 
      temp[tempplace] = '\0'; 
      param[paramplace++] = temp; 
    } 
    param[paramplace] = NULL; 
    free(temp); 
    return paramplace; 
} 
代码代码

回答

2

据我所见,你想把分割字符串作为一个指针数组(可能使得调用者负责释放它们)成为param。在循环中if语句的第一个分支中,通过将当前的temp缓冲区分配给该地点来执行此操作。然而,一旦你开始一个新的字符串(当comnmand == 0,你释放该空间,渲染以前的param入口指针无效。

只有一次释放每个指针我不会排除此代码中的其他泄漏:我认为你。可以简化您的状态机(也可能找到其他错误结果)

0

也许你没有删除正确的免费()的?实际的问题可能在调用split_string的代码中。你能证明吗?

+0

这是有点脱节,但生病试图得到相关部分 – Kracobsen 2010-11-15 15:22:42

1

当您释放临时缓冲区时,您还可以释放存储令牌的参数[]缓冲区。另一方面,如果你不打电话free(temp),你不应该这样做,当不需要令牌时,你的函数调用者有责任调用free(param[n])

+0

我有一个功能,这样做,我已经更新了它的问题 – Kracobsen 2010-11-15 15:28:13

0

很难理解你的代码,我建议你使用的sscanf而不是

您可以使用格式字符串是这样的:

"\"%[^\"]\"%n" 

了解它的功能。

我写了一个例子:

if(sscanf(string, "\"%[^\"]\"%n", matchedstring, &bytesread)) 
{ 
    handlestring(matchedstring); 
    string += bytesread; 
} 
else if(sscanf(string, "%s%n", matchedstring, &bytesread)) 
{ 
    handlestring(matchedstring); 
    string += bytesread; 
} 
else 
{ 
    handleexception(); 
} 

未经检验。 :)

+0

谢谢我会记住这一点,如果我没有时间重写代码:) – Kracobsen 2010-11-15 15:44:41

0

感谢所有评论我找到答案。 问题是for循环之前的第一个malloc是多余的,因为在开始将temp放入param之前会有另一个,因此没有指向第一个malloc的指针,所以它只是丢失了。