struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Я заполняю эту структуру, а затем использую значения. На следующей итерации я хочу сбросить все поля до 0
или null
до того, как я начну повторно использовать его.
Как я могу это сделать? Могу ли я использовать memset
или мне нужно пройти через всех участников, а затем сделать это индивидуально?
c
struct
initialization
хари
источник
источник
memset
если я хочу только сбросить все на0
??memset
заставляет меня чувствовать себя грязным. Я предпочитаю, чтобы компилятор по возможности беспокоился о структуре памяти. Строго говоря, такое использованиеmemset
непереносимо, но на практике я был бы поражен, если бы вы когда-нибудь компилировали свой код где-нибудь, что имело значение. Таким образом, вы, вероятно, можете безопасно использовать memset, если хотите.Когда у вас есть современный C (C99), способ сделать это - использовать составной литерал .
a = (const struct x){ 0 };
Это несколько похоже на решение Дэвида, только вам не нужно беспокоиться об объявлении пустой структуры или о том, объявлять ли ее
static
. Если вы используете,const
как я, компилятор может разместить составной литерал статически в хранилище только для чтения, если это необходимо.источник
{ 0 }
инициализатор по умолчанию. Выключите это предупреждение, это ложная ложная тревога.Лучше, чем все вышеперечисленное, когда-либо использовать стандартную спецификацию C для инициализации структуры:
struct StructType structVar = {0};
Здесь все биты нулевые (когда-либо).
источник
{}
в C ++. Разработчики gcc не уверены, должен ли C ++ поддерживать,{0}
и я сам не знаком с этой частью стандарта.{0}
или{}
. Не уверен, что стандарты C и C ++ ясны и синхронизированы по этому вопросу, но, очевидно, компиляторы нет.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
В C распространена идиома обнуления памяти для
struct
использованияmemset
:struct x myStruct; memset(&myStruct, 0, sizeof(myStruct));
Технически говоря, я не верю, что это переносимо, потому что предполагается, что
NULL
указатель на машине представлен целочисленным значением 0, но он широко используется, потому что на большинстве машин это так.Если вы переходите с C на C ++, будьте осторожны, чтобы не использовать эту технику для каждого объекта. C ++ делает это законным только для объектов без функций-членов и без наследования.
источник
Если у вас есть компилятор, совместимый с C99, вы можете использовать
mystruct = (struct x){0};
в противном случае вам следует сделать то, что написал Дэвид Хеффернан, т.е. заявить:
struct x empty = {0};
И в петле:
источник
Вы можете использовать
memset
с размером структуры:struct x x_instance; memset (&x_instance, 0, sizeof(x_instance));
источник
memset
- это вариант, но при его использовании вы должны убедиться, что размер памяти, в которую записывается, точно такой же, как у третьего параметра, поэтому лучше ссылаться на размер фактического объекта, а не на размер типа, который вы знаю, что это в настоящее время . IOWmemset (&x_instance, 0, sizeof(x_instance));
- гораздо лучший выбор. Кстати:(void*)
в C ++ приведение также излишне.Я считаю, что вы можете просто присвоить
{}
своей переменной пустой set ( ).struct x instance; for(i = 0; i < n; i++) { instance = {}; /* Do Calculations */ }
источник
struct x myX; ... memset(&x, 0, sizeof(myX));
источник
введите описание изображения здесь Сделайте сюрприз от gnu11!
typedef struct { uint8_t messType; uint8_t ax; //axis uint32_t position; uint32_t velocity; }TgotoData; TgotoData tmpData = { 0 };
ничего не ноль.
источник