在C中多次免费分配char *

时间:2014-12-13 12:56:39

标签: c pointers char malloc free

我在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);
        ...
    }

我一直得到运行时错误(好像它是一个infinte循环)

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

2 个答案:

答案 0 :(得分:5)

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。我建议的代码应该是内存泄漏的安全。

答案 1 :(得分:1)

您正在释放一个字符串文字,当您执行s1时,您将地址s1 = "123";丢失,现在您永远不会free

  

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

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