释放分配的字符串时内存损坏

时间:2017-01-08 02:26:52

标签: c malloc free corruption

当我尝试运行此程序时,我收到错误malloc():内存损坏。 该错误并非直接来自此函数,它发生在我尝试使用此函数后的malloc()时。如果我删除行免费(ch)它正常工作所以我想当我试图释放它时发生腐败。 main()是我如何使用该函数的一个例子。

char * makeInt(int val){ 
  char *res = malloc(5);
  char l [5] = "";
  sprintf(l,"%d",val);
  if(val < 10){
    strcat(res,"000");
    strcat(res,l);
  }
  else if(val < 100){
    strcat(res,"00");
    strcat(res,l);
  }
  else if(val < 1000){
    strcat(res,"0");
    strcat(res,l);
  }
  else if( val < 10000){
    strcat(res,l);
  }
  res[4] = '\0';
  return res;
}


  char * makeString(char *ch){
  int t = strlen(ch);
  char *chaine = malloc(t+4);
  char *nb = makeInt(t);
  strcat(chaine,nb);
  strcat(chaine,ch);
  chaine[t+4] = '\0';
  free(ch);
  return chaine;
}

int main(){
    char *path = malloc(100);
// here we do many operations on path, when i call makeString, path contains something
        path = makeString(path);
    }
编辑:对不起,我发布的时候已经很晚了,我忘记了一些信息。 我添加了makeInt()。关于include,我将它们放在我的代码中,但我不认为错过包含会导致内存损坏,因为它编译。另外,当我调用makeString()时,path包含一个字符串。我在代码中的不同位置使用makeString()。当我添加free(ch)错误时出现,但我不明白为什么释放主要分配的内存会导致内存损坏。

1 个答案:

答案 0 :(得分:0)

发布的代码包含某些逻辑错误,例如:

strcat(chaine,nb);

但是初始字符串必须有一个NUL字节,否则不知道返回什么值(I.E. undefined behavior)

malloc()的返回值在第一个字符中可能有也可能没有NUL字节。

这可能是发布代码导​​致seg故障事件的原因。

(您可以使用calloc()而不是malloc()

来解决此特定问题

另外,makeString()的参数未初始化为任何特定的NUL终止字符串。因此,将该参数传递给strlen()

是未定义的行为

(因为遇到的第一个NUL字节很可能超出了&#39;路径数组的末尾)

一些建议:

  1. 阅读代码使用的任何系统函数的手册页。
  2. 逐步执行任何代码(最好使用调试器)以查看它实际执行的操作。
  3. 这是一个可能适合您的代码版本。

    #include <stdio.h>  // printf(), sprintf()
    #include <stdlib.h> // malloc()
    #include <string.h> // strlen(), strcat()
    
    // prototypes
    char * makeString(char *ch);
    
    
    char * makeString(char *ch)
    {
        // EDIT: this line was wrong: char *chaine = malloc(sizeof(ch) + 7)  // large enough to handle any int value
        char *chaine = malloc(strlen(ch) + 7);
    
        sprintf( chaine, "%4lu", strlen( ch ) );
        strcat( chaine, " " );
        strcat( chaine, ch );
    
        return chaine;  // the caller must call `free()`
    } // end function: makeString
    
    
    int main( void )
    {
        char *path = "my path string";
        path = makeString(path);
        printf( "%s\n", path );
        free(path);
    } // end function: main
    

    ,输出为:

      14 my path string