1

拜托,你能告诉我我是否以正确的方式在我的功能中使用免费?我用 valgrind 检查了我的代码,没有发生错误。

void strconcat (char **str1, const char *str2) {
    unsigned long str1len = strlen(*str1);
    unsigned long str2len = strlen(str2);

    char *tempStr = malloc(sizeof(char) * (str1len + str2len + 1));
    memcpy(tempStr, *str1, str1len);
    memcpy(&(tempStr[str1len]), str2, (str2len + 1));

    free(*str1);
    *str1 = tempStr;
}

在主函数中,我以这种方式调用我的函数:

int main() {

    char *str1 = malloc(25);
    str1 = strcpy(str1, "First part of the string");

    char *str2 = malloc(16);
    str2 = strcpy(str2, " - second part.");
    printf("%s\n", str2);

    strconcat(&str1, str2);

    printf("%s\n", str1);

    free(str1);
    free(str2);

    return EXIT_SUCCESS;
}

谢谢您的帮助!

4

2 回答 2

0

是的,您使用正确。在中,当您将新连接的字符串分配给它时strconcat(),您将丢失最初分配给它的内存,因此在此之前您应该这样做。从该函数返回后,您仍然有两个动态分配的内存块,因此您应该释放这两个内存块。str1free()

Valgrind 通常非常值得信赖,所以你应该对它有一些信心,前提是你正在运行所有相关的不同执行路径。

但是,您对函数所做的事情是否是一个好主意,完全是另一回事。如果有人传入一个指向字符串文字的指针,那么您的函数将灾难性地失败。您的代码还存在其他一些问题,包括这strconcat是一个保留标识符,但对于它的作用,您使用free()正确。

于 2013-09-02T18:44:21.670 回答
0

void strconcat()函数中释放后,您将分配 malloc 的tempStr变量到 *str1,因此在使用 valgrind 进行调试时不会出现任何错误。

从函数中删除 *str1 = tempStr行,现在编译并运行您的程序将崩溃的程序。因为双免。

编辑:

您必须释放使用 malloc 分配的所有内存。您必须str1在分配给其他变量之前释放内存以避免内存泄漏。

free(*str1) - free for memory allocated to str1 in main() function
free(str1) - free for memory allocated to tempStr in strconcat() function.
free(str2) - free for memory allocated to str2 in main function.
于 2013-09-02T18:10:02.010 回答