在C ++中处理字符(没有std :: string)

时间:2010-11-20 19:21:33

标签: c++ arrays char dealloc

我有这段代码:

char* value = "abcdefg";

char* secondValue = value;

第二个值会得到值的地址吗?如果我删除“value”,那么第二个值将无法使用吗?

所以我应该这样做:

char* value = "abcdefg";
secondValue = new char[strlen(value)];
strcpy(secondValue, value);

所以如果我删除“值”没问题。

最后要解除我应该做的第二个值:

delete[] secondValue;
我是对的吗?

3 个答案:

答案 0 :(得分:6)

您写的内容有两个问题:

  1. 您无法删除char *value = "abcdefg";,因为它未在堆上分配。 要分配堆内存,可以使用new(在C ++中)或malloc(在C中)。

  2. 为字符串分配内存时,总是需要一个额外的字节用于空终止。

  3. 在你的情况下,你应该做到:

    secondValue = new char[strlen(value)+1];
    

    除此之外,你是对的

答案 1 :(得分:3)

如果你使用的是C ++,那么你是正确的,除非你需要让secondValue个字符更大:

secondValue = new char[strlen(value) + 1];

C风格的字符串以'\0'字符终止,该字符也需要存储空间。

如果您使用C而不是C ++,则没有newdelete[],您必须使用函数malloc()free()代替:

secondValue = malloc(strlen(value) + 1);
...
free(secondValue);

在任何情况下都要注意,示例中value是一个字符串文字,无法删除/释放。你应该只删除/释放你用new / malloc分配的内容。

答案 2 :(得分:1)

您编写代码的方式:

char* value = "abcdefg";

编译器将生成静态字符串"abcdefg",而value将是指向该字符串的指针。您可以指定secondvalue = value,然后value go out of scope, and secondvalue`仍然有效。

在您的示例中,没有其他方法可以解除分配value