C嵌套结构的默认初始化

时间:2017-02-02 14:33:07

标签: c data-structures struct initialization

我一直在尝试使用默认值初始化嵌套结构,并且只分配子子结构字段的特定字段。因此,我不必初始化嵌套结构的所有内容。

从下面的示例代码中可以看出,它在尝试打印子子结构的字段值时会生成分段错误。有没有人建议一种更好的方法来初始化默认值而不通过每个字段? 感谢

struct special_char
{
    char c;
    int size;
};

struct alphabet
{
    struct special_char* special_c;
    int special_char_size;
};

struct numeral
{
    int array_numeral;
    int size;
};
struct alpha_numeral
{
    struct alphabet alpha;
    struct numeral num;
    int size;
};

int main()
{
    printf(" Initialization of nested structures !\n");
    struct alpha_numeral test = { { { 0 } } };
    printf("values %d", test.alpha.special_c->size);
    return 0;
}
  

输出:嵌套结构的初始化!
  分段错误(核心转储)

4 个答案:

答案 0 :(得分:2)

  

是否有人建议在不通过每个字段的情况下更好地初始化默认值?

您已经演示的结构初始化是一种将初始字段设置为特定值的简单方法,并将其余字段隐式初始化(​​为零)。指定的初始值设定项可用于指定非初始成员以显式初始化。

  

从下面的示例代码中可以看出,它在尝试打印子子结构的字段值时会生成分段错误。

迂腐地说,您没有访问子子结构。您正在访问由test的子结构指向的结构的字段。除外,没有指向结构,并且您(显式地)将指针初始化为0,因此解除引用它具有未定义的行为。将其设置为指向对象:

struct special_char c = { 0 };
struct alpha_numeral test = { {  &c  } } ;

PS。你有一个太多的大括号用于初始化程序。指针没有子对象。

答案 1 :(得分:1)

您可以使用初始值设定项{0}将结构的所有字段设置为零。但是,您的主要问题是您取消引用空指针。在取消引用指针之前,您需要初始化它以引用变量。

答案 2 :(得分:0)

我假设语言是C。

您已初始化变量test将全部为零。这意味着test.alpha.special_c为NULL。您正尝试取消引用NULL指针。分段错误。

答案 3 :(得分:0)

也许我误解了这个问题,但我会为每个结构实现一个构造函数,这样你就可以用该构造函数初始化内部变量。

然后显然在第一个结构的构造函数中,你将参数传递给内部结构的构造函数,所以传递它。