You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体成员联合体初始化报错,求正确初始化方案

问题描述

定义了如下结构体:

struct ArrayAdv{
        int size;
        int length;
        union{
                struct{
                        int *A;
                } dynamic;
                struct{
                        int A[20];
                } stat;
        } item;

};

尝试用以下代码初始化时出现错误:

struct ArrayAdv arrAdv;
arrAdv.item.stat.A = {33, 2, 7, 88, 35, 90, 102, 23, 81, 97};

需要正确的初始化方法解决报错。


解决方案

1. 声明时直接初始化

C语言中数组不能通过赋值语句(=)整体赋值,只能在声明变量的同时用初始化列表完成初始化,推荐用指定初始化器(C99及以上支持)明确指定成员:

struct ArrayAdv arrAdv = {
    .size = 20,  // 静态数组的固定大小
    .length = 10, // 实际存储的元素个数
    .item.stat = {
        .A = {33, 2, 7, 88, 35, 90, 102, 23, 81, 97}
    }
};

2. 声明后分步初始化

如果必须在声明变量后再初始化数组,可选择两种方式:

逐个元素赋值

struct ArrayAdv arrAdv;
arrAdv.size = 20;
arrAdv.length = 10;
arrAdv.item.stat.A[0] = 33;
arrAdv.item.stat.A[1] = 2;
arrAdv.item.stat.A[2] = 7;
arrAdv.item.stat.A[3] = 88;
arrAdv.item.stat.A[4] = 35;
arrAdv.item.stat.A[5] = 90;
arrAdv.item.stat.A[6] = 102;
arrAdv.item.stat.A[7] = 23;
arrAdv.item.stat.A[8] = 81;
arrAdv.item.stat.A[9] = 97;

用memcpy批量复制

#include <string.h>

struct ArrayAdv arrAdv;
arrAdv.size = 20;
arrAdv.length = 10;
int temp[] = {33, 2, 7, 88, 35, 90, 102, 23, 81, 97};
memcpy(arrAdv.item.stat.A, temp, sizeof(temp));

错误原因

原代码的问题在于:数组属于非可修改左值,不能用=对数组进行整体赋值,这种初始化列表语法仅允许在变量声明阶段使用,无法用于后续的赋值操作。

内容的提问来源于stack exchange,提问作者portelo880

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:12:39