【问题标题】:Array assignment not working with pointer syntax数组赋值不适用于指针语法
【发布时间】:2013-10-22 22:44:33
【问题描述】:
#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 的语法糖。

【问题讨论】:

  • 应该是(*chars)++
  • 它最等同于*(chars + i),但无论哪种方式,代码都有未定义的行为。
  • 将其更改为 (*chars)++ 会给我一个错误左值“需要作为赋值的左操作数”

标签: c++ arrays variable-assignment


【解决方案1】:

问题在于,通过使用*chars++ = 'a' 迭代chars,您修改了指针。当你最终输出字符串时,它指向刚刚超过字符串末尾的字符。

也许你试图做这样的事情:

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

【讨论】:

  • 我读到的只是“用全零初始化它不是一个坏习惯。”为此 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2017-02-15
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多