我在此代码中初始化成员结构时遇到编译时错误。 什么是其他方法来初始化下面的数组结构。 谢谢!
#include <stdio.h>
#include <stdlib.h>
#define MAX_FUNC_MEMBERS 100
#define MAX_FUNC_DESC_STR 50
typedef struct member_struct {
double degree;
double coefficient;
} member;
typedef struct function_struct{
member members[MAX_FUNC_MEMBERS];
char *description;
} *function;
function malloc_function() {
return (function) malloc(sizeof(struct function_struct));
}
double compute_function(function f, double x) {
return 0.0;
}
int main(void) {
// f1 = x^2
function f;
f->members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0}
};
f->description = "x squared";
return 0;
}
答案 0 :(得分:2)
在您的特定情况下,即使编译了程序,您的程序也会出现段错误,因为您在没有分配数据的情况下将数据分配给*f
。
您可以选择几种解决方案。最直接的可能是简单地在堆栈上分配function
结构,但这需要您修改其typedef
不是指针,或直接使用结构名称。我将在后面的例子中使用这个例子:
struct function_struct fbuf = {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0}
},
.description = "x squared",
};
function f = &fbuf;
另一种方法是手动逐个初始化成员:
f = malloc(sizeof(*f)):
f->members[0].degree = 2.0;
f->members[0].coefficient = 1.0;
f->members[0].degree = 1.0;
f->members[0].coefficient = 1.0;
f->description = "x squared";
第三种可能是使用复合文字:
f = &(struct function_struct) {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0},
},
.description = "apa",
};
最后一个与第一个几乎完全相同,只有fbuf
是匿名的。
如果你希望在堆上而不是在堆栈上分配struct的内存,你也可以组合第二个和第三个:
f = malloc(sizeof(*f)):
*f = (struct function_struct) {
.members = {
[0] = {2.0, 1.0},
[1] = {1.0, 1.0},
},
.description = "apa",
};
至于你的“最佳实践”方面,我认为其中任何一方都不比其他方面更好或更差,但它们在某些方面不同:
function
结构,这是一个问题。 :)答案 1 :(得分:0)
你有一个char *
,但是你没有为它指向的字符串分配内存。
您可以执行以下操作:
function f = malloc(sizeof(function));
const char *desc = "x squared";
f->description = malloc(strlen(desc) + 1);
strcpy(f->description, desc);
验证它是否有效:
fprintf(stderr, "description: %s\n", f->description);