首页 > 解决方案 > 表达式必须是可修改的左值 - 设置固定长度数组的动态数组的元素时

问题描述

在我的 C++ 程序中,我有一个动态 char 数组,其中该数组上的每个元素都是另一个长度固定的数组MAX_LINE_SIZE

这就是我在main函数中定义这个数组的方式:

char (*text)[MAX_LINE_SIZE] = nullptr;

该数组应包含用户从标准输入输入的一些文本:

void init_text(char (*text)[MAX_LINE_SIZE], const int lines_count)
{
    delete[] text; 

    text = new char[lines_count][MAX_LINE_SIZE];

    for (int i = 0; i < lines_count; i++)
    {
        char* line = new char[MAX_LINE_SIZE]; 
        read_line(cin, line);

        text[i] = line;
    }
}

问题出在这一行text[i] = line;,VS Code 是这样说的:

expression must be a modifiable lvalue

当我尝试编译此代码时,我收到此错误:

prog20Feb20.cc: In function ‘void init_text(char (*)[256], int)’:
prog20Feb20.cc:32:19: error: incompatible types in assignment of ‘char*’ to ‘char [256]’
   32 |         text[i] = line;

我不明白这些错误。如果 的每个元素text都是一个char数组,为什么当我尝试将一个元素设置为text数组时它会抛出该错误char

我该如何解决?

此函数是我无法使用的作业的一部分stringvector以及其他类或函数库。我必须明确处理指针。

这就是我实现该read_line功能的方式:

void read_line(istream &is, char *line)
{
    while (is.peek() == '\n')
        is.get();

    is.get(line, MAX_LINE_SIZE); 
    is.get(); 
}

标签: c++arrays

解决方案


您不能分配给数组;你正在通过一个指向数组的指针没有区别。
此外,text[i]是一个数组并且line是一个指针,而指针不是数组。
此外,text[i]已经是一个包含元素的数组MAX_LINE_SIZE,您不需要为它分配任何动态内存。

您的代码很容易通过简化代码来修复。

for (int i = 0; i < lines_count; i++)
{
    read_line(cin, text[i]);
}

推荐阅读