我在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()
吗?
它会产生内存泄漏吗?
答案 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吗?它会产生内存泄漏吗? \
它会编译,但它不是非法使用但不正确使用的问题,是的,这是一个明显的内存泄漏。