在c中分配内存并保存字符串

我想知道为什么以下代码不起作用

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); } 

 char *test = (char*) malloc(12*sizeof(char)); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|x|x|x|x|x|x|x|x|x|x|x|x| (uninitialized memory, heap) +-+-+-+-+-+-+-+-+-+-+-+-+ test = "testingonly"; +-+-+-+-+-+-+-+-+-+-+-+-+ test + |x|x|x|x|x|x|x|x|x|x|x|x| | +-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+ +->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+ free(test); // error, because test is no longer pointing to allocated space. 

您需要使用例如strcpy或使用strdup将字符串"testingonly"复制到分配的位置,而不是更改指针test 。 请注意,如果内存不足,则mallocstrdupmalloc返回NULL ,因此应进行检查。

 char *test = (char*) malloc(12*sizeof(char)); strcpy(test, "testingonly"); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+ 

要么

 char *test = strdup("testingonly"); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+ 

你已经回答了你的问题。 从本质上讲,strcpy是复制字符串的合适方式。

第一个版本不会在堆栈上创建一个字符串,但你是正确的,你不能在分配后free它。 字符串文字通常存储在内存的常量/只读部分中。 赋值不会复制任何内容,只是将test点指向该内存区域。 你不能释放它。 您也无法修改该字符串。

你的第二段代码是正确和平常的。 如果您的实现具有此function,您可能还想查看strdup

你是对的。 现在让我们检查第一段代码。

 char *test = (char*) malloc(12*sizeof(char)); 

上面的代码没有问题。

 test = "testingonly"; 

在这里你修改了指针test导致内存泄漏。 当你试图释放时,你不会释放实际分配的指针,而是一个“testingonly”字面指向。 Literal指向常量内存,在通常情况下无法覆盖。

现在关于第二段代码,当你明确地从文本驻留到test指向的堆的位置复制数据时,这将正常工作。

对于你的第二点, strcpy是一种通常的方式。 如果要复制原始字节,其他方法是“memcpy”。

注意:文字不存储在堆栈中。 但是您无法修改存储文字的位置。

代码

 #include  int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); strcpy(test, "testingonly"); printf("string is: %s\n",test); free(test); return 0; } 

将工作

这是为了分配内存:

 char *string; string = (char *) malloc(15); 

这是为了保存数据:

 strcpy(str, "kavitajain"); printf("String = %s, Address = %u\n", str, str);