所以我得到了以下结构:
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结构中有其他元素,我找不到初始化这个表的方法:/我怎么能这样做?
感谢您的回答。
答案 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;
}