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



当我尝试运行这个程序时,我得到错误malloc():内存损坏。这个错误不是直接来自这个函数,而是当我在这个函数之后尝试malloc()时发生的。如果我删除free(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] = '';
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] = '';
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,我在代码中有它们,但我不认为遗漏的include会导致内存损坏,因为它是编译的。另外,当我调用makeString()时,path包含一个字符串。我在代码中的不同位置使用makeString()。当我添加free(ch)时,出现了错误,但我不明白为什么释放在main中分配的内存会导致内存损坏。

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

strcat(chaine,nb);

但是初始字符串必须有一个NUL字节,否则不知道会返回什么值(即未定义的行为)

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

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

(您可以使用calloc()而不是malloc()来解决此特定问题

此外,makeString()的参数未初始化为任何特定的以NUL结尾的字符串。因此,将该参数传递给strlen()是未定义的行为

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

一些建议:

  1. 阅读代码使用的任何系统函数的手册页
  2. 遍历任何代码(最好使用调试器),看看它实际做了什么

这里有一个可能适用于您的代码版本。

#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( "%sn", path );
free(path);
} // end function: main

输出为:

14 my path string

相关内容

  • 没有找到相关文章