C 如何在另一个结构中初始化结构的数组?

C 如何在另一个结构中初始化结构的数组?,c,arrays,struct,C,Arrays,Struct,所以我得到了以下结构: typedef struct typeData{ char name[20]; double weightIn; double weightOut; }dataType; typedef struct fifoTable{ unsigned short int start; unsigned short int end; dataType data[N]; } fifoTable; 以及以下用于初

所以我得到了以下结构:

typedef struct typeData{ 
    char name[20]; 
    double weightIn; 
    double weightOut; 
}dataType;

typedef struct fifoTable{ 
     unsigned short int start; 
     unsigned short int end; 
     dataType data[N]; 
} fifoTable; 
以及以下用于初始化结构的函数:

fifoTable *initFifo(){
    fifoTable table;
    table.start = 0;
    table.start = 0;
    dataType data[N];
    table.data = data;
    return table;
}
我遇到的问题是,我收到一条错误消息,上面说:“赋值给数组类型的表达式”。我查找了它,所以我认为在这样的结构中初始化数组是不可能的。我发现了一些具有char、int等数组的示例。但是由于dataType结构中还有其他元素,我找不到初始化此表的方法:/n我该怎么做


谢谢你的回答。

这不起作用,原因有很多

首先,数组不是可赋值的左值。这意味着它不能出现在作业的左侧

请注意,初始化(在定义变量时发生)与赋值不同。例如,您可以执行以下操作:

int a[3] = { 3, 4, 5 };
但不是这个:

int a[3] = { 3, 4, 5 };
int b[3];
b = a;
您还将从函数返回一个
fifoTable
,同时声明返回一个
fifoTable*

您可能希望为结构动态分配内存,将其归零,然后返回指针。您可以按如下方式进行操作:

fifoTable *initFifo(){
    fifoTable *retval = calloc(1, sizeof(fifoTable));
    if (!retval) {
        perror("calloc failed");
        exit(1);
    }
    return retval;
}
在堆栈上声明“data”和“table”,并返回指向它的指针,但这些声明的范围在函数处结束,因此指针无效

如果您想返回“fifoTable”,则使用malloc分配存储并返回指向该存储的指针,例如

fifoTable *initFifo(){
    fifoTable* table = malloc(sizeof(fifoTable));
    table->start = 0;
    table->start = 0;
    dataType data[N];
    /* initialize data somehow */
    memcpy(table.data, data, sizeof(table.data));
    return table;
}

问题1

问题是。。。“对数组类型表达式的赋值”

我认为在这样的结构中初始化数组是不可能的

代码未初始化数组。代码正在尝试执行赋值

要将一个数组的内容复制到另一个数组,请使用
memcpy()

问题2

函数返回类型是指针:
fifoTable*
,但代码试图返回结构:
fifoTable

fifoTable *initFifo(void){
    fifoTable table;
    ...
    return table;
}
要返回结构(更常见的是返回指针),请声明要匹配的返回类型

fifoTable initFifo(void){
    fifoTable table;
    ...
    return table;
}
要返回指针,请返回一个指向有效memroy的指针,方法可能是分配它

fifoTable *initFifo(void) {
  return calloc(1, sizeof(fifoTable));
}
问题3(标题问题)

如何在另一个结构中初始化结构的数组

一次一个元素

#define N 4

fifoTable initFifo(void) {
  dataType data[N];
  fifoTable table = { 0, 0, {data[0], data[1], data[2], data[3]}  };
  return table;
}

您正试图在初始化代码中返回堆栈变量作为指针。您应该使用malloc。@克里斯托弗施奈德:C语言中没有堆栈<代码>表格是一个自动变量。但是,是的,变量在返回后已失效,因此任何访问都是无效的。不过,这不是编译器错误的原因。@Olaf我在哪里可以了解到这一点?这是我第一次听到这种说法。@ChristopherSchneider:那么C标准呢?这将是ISO9899:2011,没有其他内容(只选择最终草案n1570,标准本身不是免费的,但草案在所有相关方面都是相同的)。@M.M:这是一个错误的假设,但也是错误的
auto
或“automatic”变量实际上不太适合键入。现代的编译器和ABI有太多的优化,我们可以安全地假设,即使
struct
s总是存储在堆栈上。有关示例(传递小型
struct
s),请参见AAPCS。为什么不直接设置成员数据?
fifoTable *initFifo(void) {
  return calloc(1, sizeof(fifoTable));
}
#define N 4

fifoTable initFifo(void) {
  dataType data[N];
  fifoTable table = { 0, 0, {data[0], data[1], data[2], data[3]}  };
  return table;
}