Реинициализировать временную структуру
Как я могу повторно инициализировать структуру timeval из time.h?
Я понимаю, что могу сбросить оба члена структуры до нуля, но есть ли какой-то другой метод, который я пропускаю?
5 ответов
Полностью правильный и переносимый (хотя и C99) способ инициализации нулями произвольных (возможно, агрегатных) типов:
myTime = (struct timeval){0};
Это работает даже для структур, которые содержат указатели и члены с плавающей запятой, даже если реализация не использует все нулевые биты в качестве представлений для нулевых указателей и нулей с плавающей запятой.
memset
может случиться так, чтобы работать на вашей платформе, но на самом деле это не рекомендуемый (переносимый) подход...
Это:
struct timeval myTime;
myTime = (struct timeval){ 0 };
memset
работает, потому что все элементы struct timeval
случается, что на вашей платформе есть нулевые значения, представленные битовой комбинацией из всех нулей
Но это не требуется спецификацией. В частности, POSIX не требует time_t
тип должен быть целым числом, и C не требует, чтобы ноль с плавающей точкой был представлен как все ноль байтов.
Использование синтаксиса инициализатора гарантирует, что поля структуры будут должным образом установлены в ноль, будь то целые, с плавающей запятой, указатели или другие структуры... Даже если представление этих вещей не все-ноль в памяти. То же самое не верно для memset
в общем.
Предполагая, что вы хотите struct timeval
структура повторно инициализируется до нулевых значений независимо от того, являются ли они типами с плавающей запятой или целыми типами, и независимо от нулевого представления для типов с плавающей запятой, метод, который будет работать с C90 или более поздней версией или C++:
static struct timeval init_timeval; // or whatever you want to call it
// ...
myTime = init_timeval;
Как и в ответе Р. и ответе Немо, он также будет обрабатывать указатели NULL независимо от того, как они могут быть представлены. Я не могу себе представить, почему struct timeval
будет иметь указатель, но я упоминаю об этом, потому что метод полезен для структур, кроме struct timeval
,
Недостаток этого метода по сравнению с другими ответами состоит в том, что для этого требуется где-то определить статическую или глобальную переменную. Преимущество в том, что он будет работать с компиляторами не-C99.
Если вы ищете однострочник, я думаю, вы также можете использовать memset для работы:
struct timeval myTime;
/* snip ... myTime is now initialized to something */
memset(&myTime, 0, sizeof(timeval)); // Reinitialized to zero
Вы могли бы использовать memset
тогда вы также обнуляете любых платформо-зависимых членов.