【问题标题】:How can I tell the difference between an initialized struct and an uninitialized struct?如何区分已初始化的结构和未初始化的结构?
【发布时间】:2013-06-20 20:49:01
【问题描述】:

我正在通过套接字发送学生记录。数据库向客户端发送列表中的学生人数,然后一次发送一个记录。我遇到的问题是,当没有学生时,列表以未初始化的记录开头。我考虑在记录中添加一个新字段,说明它们是新记录还是已填充,但这意味着要更改很多代码。

是否有一种简单的方法可以检查记录以查看它是否已被填写。以下是学生记录的结构。

typedef struct student{
    char lname[10], initial, fname[10];
    unsigned long SID;
    float GPA;
} SREC;

typedef struct node{
    SREC student;
    int deleted;
    struct node *left;
    struct node *right;
} NODE;

这是对起始空节点进行的初始化。

NODE *lname = calloc( 1, sizeof(NODE) );
lname->left = NULL;
lname->right = NULL;
lname->deleted = 0;

【问题讨论】:

  • 是的,手动跟踪它。
  • 那么,你怎么知道左节点或右节点未初始化呢?为什么根目录应该不同?
  • 嗯...我现在才注意到这是使用 calloc... 因此内存应该被初始化为全 0...你能重申你的问题吗?什么没有初始化?
  • 您说“数据库向客户端发送列表中的学生人数,然后一次发送一个记录。”如果没有记录,数据库不会向您发送计数 0,在这种情况下,您可以采取适当的行动,而不必乱七八糟地尝试确定您是否有有效的记录?

标签: c struct initialization


【解决方案1】:
  1. 如果您系统上的空指针具有全零位模式(并且可能确实如此),则您不需要在 calloc 之后的任何代码。

  2. 您可以通过查看任何不具有合法全零值的字段来跟踪记录是否已初始化。可能是lnameSID 字段?

【讨论】:

  • 谢谢卡尔。我不确定 NULL 是否全为零。后来我添加了删除的字段,并在我认为需要它的地方为其分配了值,即使 calloc 会为我完成它。再次感谢
【解决方案2】:

未初始化的记录可能包含任何内容。事实上,它很可能会巧合地有一些有趣的东西,甚至是星球大战开始时的书面说明。你不能依赖未初始化内存的内容。

因此,您需要引入一些东西来跟踪结构中的数据是否被填充,并故意将其设置为适当的值(这在某种程度上是初始化结构。)

【讨论】:

  • 在这种情况下,它只能有零。
  • @H2CO3:我认为确实如此。简而言之,答案是“你不能”。
  • 谢谢,我想我必须检查所有代码并更新它以获取新字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
相关资源
最近更新 更多