Как проверить, является ли структура NULL в C или c++

У меня есть следующая структура

typedef struct 
{
   char      data1[10];
   char      data2[10];
   AnotherStruct  stData;
}MyData;

по какой-то причине разработчики решили не делать stData указателем, поэтому я должен жить с этим. моя проблема в том, как проверить, пуст ли член stData? потому что, если он пуст, мне нужно пропустить некоторые вещи в моем коде.

любая помощь приветствуется

6 ответов


вам нужно как-то отметить AnotherStruct stData пустой.

  • сначала проверьте (или перепроверьте) документацию и комментарии, связанные с AnotherStruct, возможно, спросите тех, кто сделал это, если они доступны, чтобы узнать, есть ли официальный способ сделать то, что вы хотите.

  • возможно, эта структура имеет указатель, и если это нулевой указатель, структура пуста. Или, возможно, есть целое поле, где 0 или -1 или что-то может означать пустые. Или даже логическое поле, чтобы отметить его пустым.

  • если нет ничего из вышеперечисленного, возможно, вы можете добавить такое поле или такую интерпретацию некоторого поля.

  • если выше не удается, добавьте логическое поле MyData сказать, если stData - это пустое.

  • вы также можете интерпретировать некоторые значения (например, пустую строку? Полное значение 0xFF байт?) of data1 и/или data2 смысл пустой stData.

  • если вы не можете изменить или переиначить содержание или структуру, затем можно положить пустые и непустые элементы в разных контейнерах (массив, список, как там у вас). Если MyData элементы выделяются из кучи один за другим, то это по существу то же самое, что иметь свободный.

  • вариация выше, если у вас есть пустые и непустые элементы, все смешанные в одном контейнере, то у вас может быть другой контейнер с указатели или индексы к непустые предметы (или пустые предметы, или все, что соответствует вашим потребностям). Это имеет дополнительное осложнение, что вам нужно держать два контейнера в синхронизации, что может быть или не быть тривиальным.


Если это не указатель, то при создании объекта MyData будет выделена память для элемента структуры.Когда вы определяете свои структуры, установите их все в ноль с помощью calloc или memset, затем вы можете сравнить с 0


вы можете найти переменной-флага. бывший.

struct AnotherStruct {
    bool valid;
    char aother_data1[10];
    char aother_data1[10];
    //...
};

if (stData.valid==true){
    //do something
}

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

хотя это 3 года спустя, я нашел следующее решение, которое работает для меня:

template <typename T> struct is_empty {
    struct _checker: public T { uint8_t dummy; };
    static bool const value = sizeof(_checker) == sizeof(T);
};

результат можно запросить как is_empty<T>::value и доступен при компиляции время.

template <typename S>
typedef union {
    struct __attribute__((__packed__)) {
        ObjId   id;
        S       obj;
    } dataStruct;
    std::array<uint8_t, (sizeof(dataStruct) - is_empty<S>::value)> byteArray;
} _msg_t;

вот ссылки:


Struct-это определяемый пользователем тип, поскольку int встроен в тип.

struct x;
int y;

сначала попробуйте ответить "как вы можете определить, является ли ваш int пустым или нет после первого объявления"

по поводу решения:- Используйте свою структуру таким образом, если вы хотите знать, инициализирована ли она или нет: -

struct X
{
  bool b;
  X() : b(false) {}  
};

установите его true при инициализации.


Я предполагаю, что определение структуры является частью некоторой сторонней функциональности / библиотеки, где третья сторона может быть кем-то внутри вашей собственной компании.

Если исполнители решили не делать stData указатель, тогда есть причины. Они будут иметь представление о том, как выразить "stData пусто", если ему даже разрешено быть пустым. Вы обязательно должны попытаться найти эту семантику в документации или поговорить с ними. Не пытайтесь добавить свою собственную семантику в структура, которая имеет определенную цель и семантики.

Так что если есть is предопределенный способ выразить, что часть структуры пуста, используйте этот способ. Если он не может быть пустым для использования, для которого он предназначен, тогда не пытайтесь сделать его пустым. Короче говоря, не используйте класс/структуру так, как она не предназначена для использования. Вместо этого, если вы оказались в ситуации, когда у вас есть только часть данных, необходимых для того, чтобы "MyData" имели смысл, напишите свои собственные "MyPartialData" структура, чтобы справиться с этой ситуацией и перевести его в "MyData", как только у вас есть все необходимое и готовы взаимодействовать с API третьей стороны.