2013-06-20 2 views
0

Я отправляю студенческие записи через сокет. База данных отправляет клиенту количество студентов в списке и затем отправляет записи по одному. Проблема, с которой я сталкиваюсь, заключается в том, что, когда нет учеников, список начинается с неинициализированной записи. Я думал о добавлении нового поля в записи, которые указывали, были ли они новой записью или были заполнены, но это означало бы изменение МНОГО кода.Как определить разницу между инициализированной структурой и неинициализированной структурой?

Есть ли простой способ проверить запись, чтобы узнать, было ли оно заполнено. Ниже приведена структура записей студентов.

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; 
+0

Yap, отслеживайте его вручную. –

+0

Ну, как вы знаете, что левый или правый узел неинициализирован? Почему это должно быть иначе для корня? –

+0

Хм ... Я только сейчас заметил, что это использование calloc ... так как память должна быть инициализирована всем 0 ... можете ли вы повторить свой вопрос? Что не инициализировано? – wilsonmichaelpatrick

ответ

1

У неинициализированной записи может быть что-нибудь в ней. На самом деле, при очень низкой вероятности, у него могло бы быть что-то интересное или даже письменное изложение в начале «Звездных войн» в нем. Вы не можете полагаться на содержимое неинициализированной памяти.

Таким образом вам нужно ввести что-то отслеживать или нет данных в структуре заполнена, и намеренно установить его в соответствующее значение (которое, таким образом, инициализация структуры.)

+0

В этом случае он может иметь только нули. –

+2

Хотя это правильно, оно не отвечает на вопрос. –

+0

@ H2CO3: Я думаю, что так и есть. Короче говоря, ответ «вы не можете». –

3
  1. Если нулевой указатель в вашей системе имеет шаблон с нулевым битом (и, вероятно, это так), вам не нужен какой-либо из этого кода после calloc.

  2. Вы можете отслеживать, была ли запись инициализирована, просмотрев любое поле, которое не имеет законного значения с нулевым значением. Возможно, поля lname или SID?

+0

Спасибо Карл. Я не был уверен, что NULL - это все нули или нет. И позже я добавил удаленное поле и просто присвоил его значениям, где я думал, что это необходимо, хотя calloc сделал бы это для меня. еще раз спасибо – user1362058