【发布时间】:2010-12-07 08:36:49
【问题描述】:
当你去删除指针时,第一个例子不起作用。程序要么在我添加空终止符时挂起,要么在没有它的情况下挂起:
Debug Assertion Failed Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 来自 Visual Studio 2008
//Won't work when deleting pointer:
char *at = new char [3];
at = "tw"; // <-- not sure what's going on here that strcpy does differently
at[2] = '\0'; // <-- causes program to hang
delete at;
//Works fine when deleting pointer:
char *at = new char [3];
strcpy(at,"t");
at[1] = 'w';
at[2] = '\0';
delete at;
那么当我使用双引号而不是 strcpy 时会发生什么?它们都将完美地输出字符串,并且调试器不会显示任何不同。
【问题讨论】:
-
我猜你的意思是
delete[] -
您已经回答了自己的问题。 strcpy() 将字符分配给数组。 = 分配一个新数组。调试器确实显示了一些不同的东西。 'at' 的值在一种情况下会发生变化,而在另一种情况下不会发生变化。
-
仅供参考,
at = "tw";然后at[2] = '\0';是多余的。"tw"创建一个 已经 以 null 结尾的字符串文字。字符串"tw"的内存看起来像[ 't' | 'w' | '\0' ]。不仅如此,at[2] = '\0';也会导致未定义的行为;"tw"创建一个字符串文字,它是一个 不可写 的 只读 字符串,因此写入这个只读字符串文字将调用未定义的行为。要以这种方式实际分配某些内容,您必须执行const char *at = "tw";这将创建一个字符串文字并让at指向同一位置。
标签: c++ arrays string char strcpy