当你去删除指针时,第一个例子不起作用.当我添加null终止符时,程序要么挂起,要么没有它我得到:
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;
Run Code Online (Sandbox Code Playgroud)
那么当我使用双引号而不是strcpy时会发生什么?它们都会完美地完成字符串,调试器不会显示任何不同的内容.
我正在编写一个程序,我需要初始化一个保存文本的消息缓冲区.我能够使它工作,但我在下面用C语言初始化字符串的各种方式编写,我想了解其中的区别.另外,哪种方法最适合初始化wchar_t/char字符串?
方法一:
wchar_t message[100];
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这将分配一个200字节的内存空间(我认为wchar_t的大小是Windows操作系统上的2字节).此内存分配是静态的,并且在编译时将在可执行文件的.data部分内分配.
message也是一个内存地址本身,指向字符串的第一个字符.
这种初始化字符串的方法对我有用.
方法二:
wchar_t *message;
message=(wchar_t *) malloc(sizeof(wchar_t) * 100);
Run Code Online (Sandbox Code Playgroud)
此方法首先将变量消息初始化为指向wchar_t的指针.它是一个广泛的字符数组.
接下来,它将为此字符串动态分配内存.我想我已经正确地编写了它的语法.
当我在我的程序中使用此方法时,它不会读取字符串中的空格后的文本.
Example text: "This is a message"
Run Code Online (Sandbox Code Playgroud)
它只会将"This"读入变量消息,之后不会显示任何文本.
方法三:
wchar_t *message[100];
Run Code Online (Sandbox Code Playgroud)
这将消息定义为包含100个宽字符的数组和指向wchar_t的指针.这种初始化消息的方法很有效.但是,我不确定这是不是正确的方法.因为消息本身指向字符串中的第一个字符.所以,用尺寸初始化它是否正确?
我想更深入地理解它,初始化字符串的正确方法.同样的概念也可以扩展为一串字符.
int main()
{
char *name = new char[7];
name = "Dolphin";
cout << "Your name is : " << name <<endl;
delete [] name;
}
Run Code Online (Sandbox Code Playgroud)
为什么VC++编译器不抱怨?