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
相关产品推荐
相关产品推荐

