#include <iostream>
int main() {
char* chars = new char[4];
for(int i = 0; i < 4; ++i)
{
chars[i] = 'a';
}
std::cout << chars;
return 0;
}
那段代码正常工作。 stdout说
aaaa
然而,改变
chars[i] = 'a';
到
*chars++ = 'a';
或
*(chars++) = 'a';
在stderr中将stdout清空。这是怎么回事?我认为[]只是*指针的语法糖。
答案 0 :(得分:4)
问题是通过使用chars
迭代*chars++ = 'a'
,您可以修改指针。当你最终输出字符串时,它指向字符串末尾的字符。
也许你正试图做这样的事情:
for( char *p = chars, *end = chars + 4; p != end; )
{
*p++ = 'a';
}
但这很难看。第一种方式(chars[i]
)更好。在任何一种情况下,您的数组都不足以容纳4个字符的字符串,因为您需要一个空终止符。
char *chars = new char[5];
char *p = chars;
for( int i = 0; i < 4; i++ ) *p++ = 'a';
*p = '\0'; // null-terminate the string
cout << chars;
delete [] chars;
请注意,在您的情况下,动态分配没有太大用处。为什么不在堆栈上声明字符?此外,用全零初始化它并不是一个坏习惯:
char chars[5] = {0};