2012-12-15 84 views
0

我得到的代碼使用函數'time'和'time.h'中的其他函數,'time'每'時間'都返回NULL(哈哈,雖然不好笑,但這對我來說很貴將注意力集中在這樣的情況下),重新執行。事實很奇怪,這只是昨天才開始的。以前在相似但缺乏的情況下使用相同的函數(我已經添加到它)代碼證明沒問題。以下是C89代碼:爲什麼time.h中定義的函數'time'返回NULL?

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

#define EXIT_SUCCESS 0 
#define EXIT_FAILURE 1 

typedef struct tm tm; 

int logf(char input_string[]) 
{ 
    time_t* current_time_since_epoch; 
    time(current_time_since_epoch); 
    if (current_time_since_epoch == NULL) 
    { 
     printf("'time' returned NULL.\n"); 
     return EXIT_FAILURE; 
    } 
    tm* current_time_calandar_time = localtime(current_time_since_epoch); 
    if (current_time_calandar_time == NULL) 
    { 
     printf("'localtime' returned NULL.\n"); 
     return EXIT_FAILURE; 
    } 
    char current_time_textual_representation[20]; 
    strftime(current_time_textual_representation, 20, "%d-%m-%Y %H:%M:%S", current_time_calandar_time); 
    printf("%s\n", current_time_textual_representation); 
    printf("%s\n", input_string); 
    return EXIT_SUCCESS; 
} 

int main(void) 
{ 
    int check_logf = logf("Hello."); 
    if (check_logf == 0) exit(EXIT_SUCCESS); 
    else 
    { 
     printf("'logf' returned EXIT_FAILURE.\n"); 
     exit(EXIT_FAILURE); 
    } 
} 
+0

'stdlib.h'有自己的'EXIT_SUCCESS'和'EXIT_FAILURE'定義(即使在C89中),它們是可移植的。但是,'EXIT_SUCCESS'是相當無用的。 – effeffe

回答

1

您需要爲time()功能存儲結果,如果你想將它作爲一個參數分配內存。請在堆棧中聲明變量或致電malloc()。如果您將NULL作爲參數,您也可以檢索返回的值。在功能上time()原型here

+0

哎呀,我的壞。謝謝。您每5秒只能編輯一條評論。對不起,作爲一個藥丸。 – Draeton

+0

不,它不會。該函數需要一個指向內存的指針,您必須首先明確調用malloc()或使用在堆棧上聲明的變量(如我在第一個示例中所做的那樣)來「分配」。如果你給一個指向undefined的指針,time()會嘗試在內存中一個未定義的位置寫一些東西,你不應該那樣做。 – koopajah

2

當你傳遞的time_ttime()它存儲在該地址的結果地址

time_t current_time_since_epoch; 
time(&current_time_since_epoch); 
// or 
current_time_since_epoch = time(NULL); 
// or 
time_t* timePtr = (time_t*) malloc(sizeof(time_t)); 
time(timePtr); 
// ... 
free(timePtr); 

更多信息。既然你沒有分配任何內存來存儲結果(你所做的只是聲明一個未初始化的指針),你會得到未定義的行爲。只需通過NULLtime,它將返回值。

time_t current_time_since_epoch = time(NULL); 
相關問題