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;
}