数组赋值无法使用指针语法
Array assignment not working with pointer syntax
#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';
将标准输出设置为空,而 stderr 中没有任何内容。这是怎么回事?我认为 [] 只是 *指针的语法糖。
问题是通过使用*chars++ = 'a'
遍历chars
可以修改指针。 当您最终输出字符串时,它指向刚过字符串末尾的字符。
也许您正在尝试做这样的事情:
for( char *p = chars, *end = chars + 4; p != end; )
{
*p++ = 'a';
}
但这很丑陋。 第一种方式(chars[i]
)更好。 无论哪种情况,数组都不够大,无法容纳 4 个字符的字符串,因为您需要一个 null 终止符。
char *chars = new char[5];
char *p = chars;
for( int i = 0; i < 4; i++ ) *p++ = 'a';
*p = ' '; // null-terminate the string
cout << chars;
delete [] chars;
请注意,在您的案例中,动态分配没有太多用处。 为什么不直接在堆栈上声明字符? 此外,用全零初始化它并不是一个坏做法:
char chars[5] = {0};