如何在另一个struct中初始化一个struct数组?

时间:2016-08-16 20:47:42

标签: 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; 

以及应该初始化结构的以下函数:

fifoTable *initFifo(){
    fifoTable table;
    table.start = 0;
    table.start = 0;
    dataType data[N];
    table.data = data;
    return table;
}

我遇到的问题是我收到一条错误消息:“分配给带有数组类型的表达式”。我查了一下,所以我认为不可能在这样的结构中初始化一个数组。我找到了一些char,int等数组的例子。但是由于dataType结构中有其他元素,我找不到初始化这个表的方法:/我怎么能这样做?

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

由于种种原因,这项工作无法实现。

首先,数组不是可赋值的左值。这意味着,当您尝试执行此操作时,它无法显示在作业的左侧。

请注意,初始化(在定义变量时发生)与分配不同。例如,您可以这样做:

int a[3] = { 3, 4, 5 };

但不是这样:

int a[3] = { 3, 4, 5 };
int b[3];
b = a;

您声明返回fifoTable时,您还会从您的函数返回fifoTable *

你可能想要的是为你的struct动态分配内存,将其归零并返回指针。你这样做如下:

fifoTable *initFifo(){
    fifoTable *retval = calloc(1, sizeof(fifoTable));
    if (!retval) {
        perror("calloc failed");
        exit(1);
    }
    return retval;
}

答案 1 :(得分:1)

在堆栈上声明“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;
}

答案 2 :(得分:1)

问题1

  

问题......“用数组类型赋值给表达式”。

table.data = data;
  

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

代码不是初始化数组。代码正在尝试执行分配

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

memcpy(table.data, data, sizeof table.data);`

问题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(标题问题)

  

如何在另一个struct中初始化一个struct数组呢?

一次一个元素。

#define N 4

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