在 C 中多次释放分配的字符*



我在C中有以下代码:

 char* func(char* str, int a) {
        str = malloc(a * sizeof(char));
        return str;
    }
    int main() {
        char* s1 = NULL;
        s1 = func(s1,4);
        s1 = "123";
        free(s1);
        s1 = func(s1, 5);
        s1 = "1234";
        free(s1);
        ...
    }

我一直收到运行时错误(好像它是一个无限循环)

main()中使用s1合法吗?会产生内存泄漏吗?

s1 = "123";在这里你s1指向字符串文字,你永远不应该为字符串文字调用free。我的猜测是你的意思是将这些字符复制到分配给s1的内存中。如果是这种情况,请使用 strcpy。例如:

char* func(char* str, int a) {
    str = malloc(a * sizeof(char));
    return str;
}
int main() {
    char* s1 = NULL;
    s1 = func(s1,4);
    strcpy(s1, "123");
    free(s1);
    s1 = func(s1, 5);
    strcpy(s1, "1234");
    free(s1);
    ...
}

至于你的第二个问题 - 你的代码中有内存泄漏,但正是因为我已经提到的原因 - s1 = "123";不复制字节,而是指向文字s1。我建议的代码应该不会发生内存泄漏。

您正在释放字符串文字,并且在执行s1 = "123";时丢失了s1指向的地址,现在您永远无法free它。

在 main() 中使用 s1 合法吗? 会产生内存泄漏吗? \

它会编译,但这不是非法使用的问题,而是不正确的使用,是的,这是一个明显的内存泄漏。

相关内容

  • 没有找到相关文章

最新更新