数组赋值不使用指针语法

时间:2013-10-22 22:44:33

标签: c++ arrays variable-assignment

#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清空。这是怎么回事?我认为[]只是*指针的语法糖。

1 个答案:

答案 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};