我在想为什么下面的代码不能工作
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
test = "testingonly";
free(test);
}
经过思考,我的假设是我在内存中为12个字符分配了空间,但是下一行的赋值会在堆栈上创建一个char数组,并将其内存地址传递给test。因此free()尝试释放堆栈上的空间,这是不允许的。这样理解正确吗?
那么正确的方法是什么来保存字符串到堆上?下面这种方式常见吗?
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
strcpy(test, "testingonly");
free(test);
}
test
中的字符串常量,这样就失去了对这块内存唯一的引用。之后,你就没有合法的方式来引用这块已分配的内存——造成了内存泄漏。 - Jonathan Lefflerstrcpy
或strncpy
或memcpy
。strncpy 比 strcpy 更好,因为它在最多复制 N 个字符时有助于避免缓冲区溢出问题。 - Agnius Vasiliauskas