在C中初始化struct,最佳实践

时间:2014-02-13 07:13:53

标签: c ansi

我在此代码中初始化成员结构时遇到编译时错误。 什么是其他方法来初始化下面的数组结构。 谢谢!

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

2 个答案:

答案 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",
};

至于你的“最佳实践”方面,我认为其中任何一方都不比其他方面更好或更差,但它们在某些方面不同

  • 第三个和第四个,使用复合文字,需要后一版本的C,所以如果你的目标是符合古老的C编译器,那么它们是个坏主意。不过,这应该是一个罕见的问题。
  • 第一个和第三个分配堆栈上的数据,而第二个和第四个分配堆上的数据。这是不同的,而不是更好或更糟,所以选择适合你的情况。
  • 根据编译器的不同,第二个示例可能更快,因为它不会触及未使用的98个成员。但是,你必须在一个非常紧密的循环中初始化很多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);