表达式必须是可修改的左值 C/C++(137) [重复]

expression must be a modifiable lvalue C/C++(137) [duplicate]

提问人:umut utku 提问时间:11/8/2023 更新时间:11/8/2023 访问量:53

问:

我正在尝试将一个 2D 数组分配给结构中定义的另一个 2D 数组。但是我收到这个错误;“表达式必须是可修改的左值 C/C++(137)”。

这是代码;

#define NUM_TEMPLATES 4

float templateForehand1[3][50];
struct templ_st {
    float frame[3][50];
};
struct templ_st templates[NUM_TEMPLATES];

templates[0].frame = templateForehand1;

我收到最后一行的错误。

任何关于为什么会发生此错误的见解都将不胜感激。

数组 c struct lvalue

评论

0赞 9769953 11/8/2023
也许你认为每个(静态)数组都是一个指针,你可以将一个指针分配给另一个指针。这在这里根本行不通。也许如果你真的使用 和 的地址,但这确实是你想要的吗?为什么不在(双)循环中复制值?.frametempalteForehand1
0赞 stark 11/8/2023
不能在一次分配中分配整个阵列。

答:

1赞 0___________ 11/8/2023 #1

不能用 C 语言分配数组。

您需要复制它或使用指针。

    memcpy(templates[0].frame, templateForehand1, sizeof(templates[0].frame));

struct templ_st {
    float (*frame)[50];
};

/* ... */

templates[0].frame = templateForehand1;

但是第二个选项不会提供数组的深层副本,而只是对它的引用。

另一种选择是将结构体用作两个对象

struct templ_st {
    float frame[3][50];
};

struct templ_st templateForehand1 ={{ /* init */ }};

/*   ... */
    struct templ_st templates[NUM_TEMPLATES];

    templates[0].frame = templateForehand1;

1赞 Lundin 11/8/2023 #2

您可以将包含数组的结构分配给另一个相同类型的结构。但是,C 不允许原始数组的赋值/初始化 - 这只是语言的设计方式。

选项 1 - 仅使用结构:

struct templ_st {
    float frame[3][50];
};

const struct templ_st template1 = { .frame = {/* array init list here */} };
struct templ_st templates[NUM_TEMPLATES];
...
templates[0] = template1;

选项 2 - :memcpy

memcpy(templates[0].frame, templateForehand1, sizeof(templates[0].frame));