Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何区分初始化结构和未初始化结构之间的区别?_C_Struct_Initialization - Fatal编程技术网

C 如何区分初始化结构和未初始化结构之间的区别?

C 如何区分初始化结构和未初始化结构之间的区别?,c,struct,initialization,C,Struct,Initialization,我正在通过插座发送学生记录。数据库向客户端发送列表中的学生人数,然后一次发送一个记录。我遇到的问题是,当没有学生时,列表以未初始化的记录开始。我考虑在记录中添加一个新字段,说明它们是新记录还是已填充,但这意味着要更改很多代码 有没有一种简单的方法来检查记录是否已填写。以下是学生记录的结构 typedef struct student{ char lname[10], initial, fname[10]; unsigned long SID; float GPA; } S

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

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

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
    之后不需要任何代码

  • 您可以通过查看任何没有合法全零值的字段来跟踪记录是否已初始化。可能是
    lname
    SID
    字段

  • 如果系统上的空指针具有全零位模式(很可能是这样),则在
    calloc
    之后不需要任何代码

  • 您可以通过查看任何没有合法全零值的字段来跟踪记录是否已初始化。可能是
    lname
    SID
    字段


  • 是的,手动跟踪它。那么,您如何知道左侧或右侧节点未初始化?为什么根的情况会不同呢?嗯。。。我现在才注意到这是在使用calloc。。。因此,内存应初始化为所有0。。。你能再说一遍你的问题吗?什么是未初始化的?您说“数据库向客户端发送列表中的学生人数,然后一次发送一个记录。”如果没有记录,数据库不会向您发送计数0,在这种情况下,您可以采取适当的行动,而不必纠结于确定您是否有有效的记录?是的,手动跟踪它。那么,您如何知道左侧或右侧节点未初始化?为什么根的情况会不同呢?嗯。。。我现在才注意到这是在使用calloc。。。因此,内存应初始化为所有0。。。你能再说一遍你的问题吗?什么是未初始化的?您说“数据库向客户端发送列表中的学生人数,然后一次发送一个记录。”如果没有记录,数据库不会向您发送计数0,在这种情况下,您可以采取适当的行动,而无需乱弄弄来确定您是否有有效的记录。在这种情况下,它只能有零。@H2CO3:我想是的。简言之,答案是“你不能”。谢谢,我想我必须检查所有的代码并更新为一个新字段。在这种情况下,它只能有零。@H2CO3:我想是的。简言之,答案是“你不能”。谢谢,我想我必须通读所有的代码,并将其更新为一个新字段。谢谢Carl。我不确定NULL是否都是零。后来我添加了deleted字段,并在我认为它需要的地方给它赋值,即使calloc会帮我这么做。再次感谢汉克斯·卡尔。我不确定NULL是否都是零。后来我添加了deleted字段,并在我认为它需要的地方给它赋值,即使calloc会帮我这么做。再次感谢