2016-11-27 6 views
9

У меня есть массив времени здесь:C++ STRUCT тм и time_t

struct cl{ 
    unsigned char *buffer; 
    time_t t = time(0); 
    struct tm * ct = localtime(&t); 
}; 

, а затем:

cl sadi[10]; 

Но, например, я получил sadi[5] в 21:58, и когда я получил sadi[6] в 21:59 , Затем я снова проверяю все мои sadi[].ct->tm_min: 59. В чем проблема? Разве это не может удержать момент, когда вы его запечатлеете, всегда будет ли он обновляться? Если да, то как я могу зафиксировать момент времени, и он не обновляется так.

+0

Действительно ли это C++? Когда появилась возможность инициализировать элементы такой структуры? –

+3

@ AndonM.Coleman С C++ 11. Вы можете иметь инициализацию члена класса. – vsoftco

+0

как ответ ниже, это была моя ошибка, я не должен инициализировать член с указателем, подобным этому в этом случае, – VirusPTIT

ответ

15

Эта линия:

struct tm* ct = localtime(&t); 

Проблема заключается в том, что указатель что localtime(&t) возвращает это внутренний буфер статический. Таким образом, каждый раз, когда он вызывается, он возвращает точно такое же значение (адрес) указателя. Это означает, что все ваши элементы массива имеют указатели на тот же объект struct tm.

Одно из решений, чтобы сделать копию данных каждый раз, когда вы называете localtime:

struct cl { 
    unsigned char* buffer; 
    time_t t = time(0); 
    struct tm ct = *localtime(&t); 
}; 

Так что теперь я объявляю struct tm ct; (не указатель) и инициализировать его с разыменованного значение из возвращенный указатель *localtime(&t).

 Смежные вопросы

  • Нет связанных вопросов^_^