0
#include <iostream>

int main() {
    char* chars = new char[4];
    for(int i = 0; i < 4; ++i)
    {
        chars[i] = 'a';
    }
    std::cout << chars;
    return 0;
}

那段代码可以正常工作。标准输出 说

aaaa

然而,改变

chars[i] = 'a';

*chars++ = 'a';

或者

*(chars++) = 'a';

使标准输出为空,标准错误中没有任何内容。这是怎么回事?我认为 [] 只是 *pointer 的语法糖。

4

1 回答 1

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};
于 2013-10-22T22:53:44.103 回答