3

我有以下嵌套struct定义:

typedef struct {
    int count;
    float cash;
    char item[50];//switch between array and pointer for testing initializers
    //char *item;
}Purchase;

typedef struct {
    int accnt;
    char acct_name[50];
    Purchase purch;
} Acct;

就其Purchase struct本身而言,以下初始化程序起作用:

//Uses member names:
/* 1 */Purchase p = {.count = 4, .cash = 12.56, .item = "thing"};
//  Note: this member:                          ^^^^^^^^^^^^^^^

对于嵌套结构Acct,以下工作:

// No member names:
/* 2 */Acct acct = {100123, "Robert Baily", {15, 12.50, "Tires"}};
//                                                      ^^^^^^^

但是当我尝试使用成员名称时,如第一个示例所示:

// Attempts to use member name, but fails the last one:
/* 3 */Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};
// error occurs here ->                                                                                                                ^

我收到此错误: 22, 131 error: array type 'char [50]' is not assignable 使用会员char item[50]; in购买时`

我得到这个错误:22, 14 error: initializer element is not a compile-time constant 当使用成员char *item;Purchase (注意只有一个版本itemstruct任何时候的一部分,另一个被评论)

因此,总而言之,如果不使用/* 2 */上述语句中的命名赋值语句,我可以初始化嵌套结构,但是当我尝试使用命名赋值时,如char []语句中的类型所示/* 3 */,它会失败。

char []初始化 a或char *当它是嵌套结构构造的内部结构的成员时,我缺少什么?

我正在使用CLANG设置为 C99

4

2 回答 2

3

您正在尝试编译:

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
           {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};

此初始化程序无效,因为acct3.purch不是 的字段名称Purchase。初始化时只使用最里面的字段名称。

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
              .purch = {.count = 15, .cash = 12.50, .item = "Tires"}};
于 2020-03-18T20:07:56.070 回答
0

结构 Acct 和结构Purchase都没有数据成员名称acct3。所以这个变量的初始化列表Acct acct3

{acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}

是无效的。

考虑到错误消息,编译器会考虑这样的初始化列表的一部分

acct3.purch.item = "Tires"

作为对象 acct3 的数据成员项的赋值,数组没有赋值运算符,因为它们是不可修改的左值。

于 2020-03-18T19:59:56.940 回答