我有这段代码:
char* value = "abcdefg";
char* secondValue = value;
第二个值会得到值的地址吗?如果我删除“value”,那么第二个值将无法使用吗?
所以我应该这样做:
char* value = "abcdefg";
secondValue = new char[strlen(value)];
strcpy(secondValue, value);
所以如果我删除“值”没问题。
最后要解除我应该做的第二个值:
delete[] secondValue;
我是对的吗?
答案 0 :(得分:6)
您写的内容有两个问题:
您无法删除char *value = "abcdefg";
,因为它未在堆上分配。
要分配堆内存,可以使用new
(在C ++中)或malloc
(在C中)。
为字符串分配内存时,总是需要一个额外的字节用于空终止。
在你的情况下,你应该做到:
secondValue = new char[strlen(value)+1];
除此之外,你是对的
答案 1 :(得分:3)
如果你使用的是C ++,那么你是正确的,除非你需要让secondValue
个字符更大:
secondValue = new char[strlen(value) + 1];
C风格的字符串以'\0'
字符终止,该字符也需要存储空间。
如果您使用C而不是C ++,则没有new
或delete[]
,您必须使用函数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
。