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