【问题标题】:C++ array assign error: invalid array assignmentC++ 数组赋值错误:无效的数组赋值
【发布时间】:2011-05-06 08:19:01
【问题描述】:

我不是 C++ 程序员,所以我需要一些有关数组的帮助。 我需要将一个字符数组分配给某个结构,例如

struct myStructure {
  char message[4096];
};

string myStr = "hello"; // I need to create {'h', 'e', 'l', 'l', 'o'}

char hello[4096];
hello[4096] = 0;
memcpy(hello, myStr.c_str(), myStr.size());

myStructure mStr;
mStr.message = hello;

我收到error: invalid array assignment

如果mStr.message 和hello 具有相同的数据类型,为什么它不起作用?

【问题讨论】:

  • 你必须使用 strcpy 或 memcpy 函数而不是 mstr.message = hello。
  • hello[4096] = 0; 行是错误的。这是数组的最后一个元素。只需删除此行。

标签: c++ c arrays


【解决方案1】:

因为您不能分配给数组——它们不是可修改的左值。使用 strcpy:

#include <string>

struct myStructure
{
    char message[4096];
};

int main()
{
    std::string myStr = "hello"; // I need to create {'h', 'e', 'l', 'l', 'o'}
    myStructure mStr;
    strcpy(mStr.message, myStr.c_str());
    return 0;
}

正如 Kedar 已经指出的那样,您还写出了数组的末尾。

【讨论】:

  • 实际上,Alex 的代码中的数组mStr.message 和hello 是 左值,因为表达式&amp;mStr.message 和&amp;hello 是有效的。 (请参阅 C++ 标准中的第 5.3.1 节第 3 段。)
  • 是的,你是对的——对不起。看来我应该说的是 myStr.message 不是 modifiable l-value。
  • 有趣。这样做的动机是什么?我没有看到分配给构成复制内存的数组的问题。
  • @Claudiu 我的假设是它与 C 中的数组变量名本身引用数组起始地址的指针这一事实有关,而数组的类型原则上不是包含有关其长度的信息。因此,直接分配将是您很少需要的指针分配,并且无法自动复制数组,因为长度与类型未知。使用 memcpy 你必须指定长度。
【解决方案2】:

如果mStr.message 和hello 具有相同的数据类型,为什么它不起作用?

因为标准是这样说的。数组不能赋值,只能初始化。

【讨论】:

    【解决方案3】:

    声明char hello[4096]; 为4096 个字符分配堆栈空间,索引从0 到4095。 因此,hello[4096] 无效。

    【讨论】:

      【解决方案4】:

      你需要使用 memcpy 来复制数组。

      【讨论】:

        猜你喜欢
        • 2018-02-02
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        相关资源
        最近更新 更多