在 strcat 之后释放分配的字符串

Free allocated string after strcat

根据 我现在的代码是这样的:

 void someFunction(char** string, char** argv) {
    *string = (char*)malloc(strlen(argv[2]) + 1);
    strcpy(*string, argv[2]);
    strcat(*string, ".txt"); //works fine without this
}

int main(int argc, char** argv) {
    char *string; 
    char *string2;

    someFunction(&string,argv);
    printf("%s",string);
    free(string); // freezes here due the strcat
}

将 strcat 添加到链接问题的代码后,当我尝试释放我的字符串时它冻结了。

您没有为生成的串联字符串分配足够的 space;当您写到最后时,您会调用未定义的行为(在这种情况下,可能是堆损坏)。将 malloc 更改为分配 strlen(argv[2]) + strlen(".txt") + 1 以便您有足够大的缓冲区来容纳整个字符串。

函数 someFunction 有错误。它没有分配足够的内存来追加 ".txt".

它可能看起来像下面这样

 void someFunction(char** string, char** argv) {
    *string = (char*)malloc(strlen(argv[2]) + 1 + 4 );
    strcpy(*string, argv[2]);
    strcat(*string, ".txt"); //works fine without this
}

不过不管怎么说,这个功能的设计还是很糟糕的。它在表达式 argv[2] 中使用幻数 2。如果函数处理 argv[2],那么将整个数组 pf 指针 argv 作为参数传递是没有意义的。你应该直接通过 argv[2]。此外,它通过引用使用参数 string 但不会释放参数可以指向的内存。所以它的界面比较混乱。

你可以使用我对问题的回答中显示的功能 Safe way to concat two strings in C

函数可以这样调用

char *string = getConcatString( argv[2], ".txt" );

if ( string ) puts( string );

free( string );