如何在堆中为char[]赋值

  • 本文关键字:char 赋值 c++ c
  • 更新时间 :
  • 英文 :


我的代码中出现_CrtIsValidHeapPointer错误。我终于发现是什么引起了麻烦
我用下面的例子来说明它:

char* c=(char*)malloc(20*sizeof(char));
//cout<<&c<<endl;
c="hello world";
//cout<<&c<<endl;  //if you uncomment the 2 clauses,you'll see the address is the same
                                  //which means the string literal is in the heap
cout<<c<<endl;
free(c);

1) 字符串文字使用的空格似乎无法释放?为什么?

2) 给char数组赋值的方法不是什么
ps:我使用sprintf(c,"hello world");,它运行良好。但还有更好的方法吗?


看完答案后。我意识到我误解了&c.
我应该使用printf("%pn",c);

您应该使用strcpy复制字符串。

赋值c="hello world"不复制字符串的内容,而是将字符串文本的地址分配给指针c。当您随后调用free(c)时,指针不再是有效的堆地址。

//如果你取消注释这两个子句,你会看到地址是相同的

您看到的不是指针c,而是指针的address。这显然是相同的。

您需要使用strcpy或更安全的版本strncpy。请注意,对于strncpy,您必须自己NUL终止字符串,以防空间不足。

示例:

char *some_other_string = ...;
int len = strlen(some_other_string);
char *c = malloc((len + 1) * sizeof(*c));
if (c == NULL)
    // handle error
strcpy(c, some_other_string);
free(c);

注意,在这种情况下,我们知道c中有足够的空间,所以我们可以使用strcpy。如果我们不知道,你可以把绳子剪到你能处理的地方:

char *some_other_string = ...;
char *c = malloc((MAX_LEN + 1) * sizeof(*c));
if (c == NULL)
    // handle error
strncpy(c, some_other_string, MAX_LEN);
c[MAX_LEN] = '';
free(c);

请注意,在strncpy的情况下,如果没有足够的空间,则字符串不会以NUL结尾,您必须手动执行。


旁注:

CCD_ 13是变量CCD_ 14的地址。它与内容无关,所以无论你对c做什么,&c都不会改变。

c = "hello world";

您正在将c指针修改为指向"hello world"字符串文字的指针。这不会复制字符串,而只是修改c指针。您必须使用strcpy函数来复制char数组中的字符串。

strcpy(c, "hello world");

如果使用该语言的C++部分,则这一切都由C++标准库中的std::string处理。

std::string c = "hello world"; 
cout << c << endl;

完成!

您不必手动管理任何内容。

最新更新