2012-01-14 1 views
3

У меня возник вопрос о том, как работает glibc ctime().Поймите последовательный вызов ctime()

Следит мой сниппет:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 


int main (int argc,char** argv) 
{ 
    int ret=EXIT_SUCCESS; 

    time_t tm1; 
    time_t tm2; 


    tm1 = time(NULL); 
    tm2 = tm1 + 60; // 60 seconds later 


    puts("1st method-------"); 
    printf("tm1 = %stm2 = %s",ctime(&tm1),ctime(&tm2)); 


    puts("2nd method-------"); 
     printf("tm1 = %s",ctime(&tm1)); 
    printf("tm2 = %s",ctime(&tm2)); 

    return(ret); 
} 

я получил:

1st method------- 
tm1 = Sat Jan 14 01:13:28 2012 
tm2 = Sat Jan 14 01:13:28 2012 
2nd method------- 
tm1 = Sat Jan 14 01:13:28 2012 
tm2 = Sat Jan 14 01:14:28 2012 

Как вы видите, в первом способе и тм имеют такое же значение, которое не является правильным. Во втором методе я получил правильные значения. Я знаю, что ctime() помещает эту строку в статический буфер, и для ее перезаписывания нам нужен последовательный вызов ctime().

В: Я не делаю последовательный вызов в 1-м методе?

Благодарим за внимание.

ответ

3

Вы предоставили всю информацию, необходимую для решения проблемы.

Второй метод работает так, как вы ожидали: ctime вызывается, заполняет буфер и результаты распечатываются; этот процесс затем повторяется. Таким образом, вы получаете два разных раза.

Для первого метода порядок отличается: ctime вызывается, затем он вызывается снова, и только тогда результаты печатаются. Результаты каждого вызова в ctime совпадают, по крайней мере, в том, что касается printf: адрес статического буфера. Но содержимое этого буфера было изменено каждым вызовом, и поскольку printf не смотрит в буфер до тех пор, пока оба ctime-вызова не будут выполнены, он дважды печатает более новое содержимое.

Таким образом, вы делаете оба вызова в первом методе, а именно, чтобы результаты первого вызова были перезаписаны до того, как они будут распечатаны.

+0

спасибо, но, как вы видите, он сохранил старый (tm1), а не новый (tm2) результат, он не перезаписывает буфер, если только ctime (& tm2) не обрабатывается до ctime (& tm1) – hadi

+0

@ Хади: То, что вы, похоже, не понимаете, состоит в том, что аргументы приводятся в обратном порядке. когда оба выражения ctime являются прерванными для printf, одно с tm1 называется LAST, а не FIRST. Скотт понял это правильно. – boatcoder

+0

@ Mark0978 Параметры функции не оцениваются в определенном порядке в 'C'. _Вы могли бы знать это к этому времени. _ Http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in-c – VoidPointer