strcat后自由分配的字符串

时间:2016-04-05 22:35:38

标签: c malloc strcat

根据Allocate string (char*) in another function,我现在有这样的代码:

 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添加到链接问题的代码中后,当我尝试释放字符串时,它会冻结。

2 个答案:

答案 0 :(得分:3)

您没有为生成的连接字符串分配足够的空间;当您在结束时写入时,您将调用未定义的行为(在这种情况下,可能是堆损坏)。更改malloc以分配strlen(argv[2]) + strlen(".txt") + 1,这样您就拥有足够大的缓冲区来容纳整个字符串。

答案 1 :(得分:2)

函数System.out.println("List of Cities:"); for (Vertex v : vertices) { System.out.println(v); } Scanner k = new Scanner(System.in); System.out.println("\nEnter start location: "); int start = k.nextInt(); System.out.println("Enter destination: "); int destination = k.nextInt(); computePaths(vertices[start]); System.out.println("\nDistance to " + vertices[destination] + ": " + vertices[destination].minDistance); List<Vertex> path = getShortestPathTo(vertices[destination]); System.out.println("Path: " + path); } 有一个错误。它没有分配足够的内存来追加 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 } 中使用幻数2。如果函数处理argv[2],那么将整个数组pf指针argv[2]作为参数传递是没有意义的。你应该通过argv。此外,它通过引用使用参数argv[2],但不释放参数可以指向的内存。所以它的界面令人困惑。

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

可以像

一样调用该函数
string