【问题标题】:C Default initialization of nested structuresC 嵌套结构的默认初始化
【发布时间】:2017-02-02 14:33:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • C 还是 C++?选择一个,答案会有所不同。
  • 你在哪里为special_char* special_c分配内存?
  • 它甚至不能编译为 C++。

标签: c data-structures struct initialization


【解决方案1】:

有没有人建议一种更好的方法来初始化默认值而无需遍历每个字段?

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

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

学究式地,您没有访问子子结构。您正在访问由test 的子结构指向的结构的字段。除了,不存在指向结构并且您(显式)将指针初始化为 0,因此取消引用它具有未定义的行为。将其设置为指向一个对象:

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

PS。初始化器的大括号太多了。指针没有子对象。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      那么很明显,在第一个结构的构造函数中,你将参数传递给内部结构的构造函数,所以继续传递它。

      【讨论】:

      • 这不是 C++ 代码,但公平地说,操作的标签不正确。
      【解决方案4】:

      我假设语言是 C。

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

      【讨论】:

      • "您正试图取消引用一个 NULL 指针。分段错误。"真的吗?
      • @George:printf("values %d", test.alpha.special_c->size);线上test.alpha.special_c的值为0。
      • nono,我可以看到 special_c 为空,但它真的会绝对导致段错误吗?
      • 可能会导致分段错误,可能会导致太阳西升,甚至会打印出无意义的值。在许多系统上,它会可靠地导致分段错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多