如何为堆中的char []赋值?

时间:2012-08-01 09:25:28

标签: 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)你用什么方法将valee分配给char数组?
ps:我使用sprintf(c,"hello world");工作正常。但是更好的方法呢?


阅读答案后。我意识到我误解了&amp; c。的含义 我应该使用printf("%p\n",c);代替。

4 个答案:

答案 0 :(得分:7)

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

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

  

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

你看到的不是指针c,而是指针的地址,显然是相同的。

答案 1 :(得分:6)

您需要使用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] = '\0';

free(c);

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


旁注:

&c是变量c的地址。它与其内容无关,因此无论您使用c执行什么操作,&c都不会更改。

答案 2 :(得分:3)

c = "hello world";

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

strcpy(c, "hello world");

答案 3 :(得分:0)

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

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

完成!

您无需手动管理任何内容。