1

我有这个代码:

char* value = "abcdefg";

char* secondValue = value;

第二个值将获得值的地址好吗?如果我删除“值”,那么 secondValue 将不可用,对吗?

所以我应该这样做:

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

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

最后解除我应该做的 secondValue :

delete[] secondValue;

我对吗?

4

3 回答 3

6

你写的有两个问题:

  1. 您不能 delete char *value = "abcdefg";,因为它没有在堆上分配。要分配堆内存,您使用new(在 C++ 中)或malloc(在 C 中)。

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

在你的情况下,你应该这样做:

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

除此之外,你是对的

于 2010-11-20T19:25:39.793 回答
3

如果您使用的是 C++,那么您是正确的,只是您需要使secondValue一个字符变大:

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

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

如果您使用 C 而不是 C++,则没有newordelete[]并且您必须使用函数malloc()andfree()来代替:

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

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

于 2010-11-20T19:27:58.983 回答
1

您编写代码的方式:

char* value = "abcdefg";

编译器将生成一个静态字符串"abcdefg",并且value是一个指向它的指针。您可以分配secondvalue = value,然后让value go out of scope, andsecondvalue` 仍然有效。

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

于 2010-11-20T19:28:41.447 回答