2014-11-14 88 views
0

我試圖用當前日期和時間返回char *來創建函數。但即時通訊snprintf即時得到分段錯誤。 這是代碼的一部分。snprintf()中的分割錯誤c

int buf_size = 20; 
char *n = NULL; 
snprintf(n, buf_size , "%d-%d-%d %d:%d:%d\n", 1900+st.tm_year, 
     st.tm_mon+1, st.tm_mday, st.tm_hour, st.tm_min, st.tm_sec); 

回答

2

nNULL,所以你試圖複製到一個無效的內存位置。

考慮與

char n[80]; /* at least enough characters for the buffer */ 

,或者更適合的替換第二行返回一個字符串

char *n = (char *) malloc(80 * sizeof(char)); 
+0

OP說他們試圖*返回格式化的字符串,所以這隻會解決問題。 – zwol 2014-11-14 16:53:23

+0

好點。相應修改。 – 2014-11-14 16:54:25

+0

在C中,不要施加'malloc'的結果,它可以隱藏由於#include '錯誤導致的錯誤。 (雖然在C++中是必需的)。在所有C族語言中,根據定義,「sizeof(char)== 1」*因此明確寫入它是一種糟糕的代碼異味。 – zwol 2014-11-14 17:05:54

1

你需要分配內存,將指針p指出並你要去哪裏寫數據。

而不是

char *n = NULL; 

你應該寫

char *n = malloc(buf_size); 
3

snprintf不分配緩衝區爲您服務。您將n設置爲NULL,因此它樂於嘗試寫入不存在的內存位置並崩潰。

您想改爲使用asprintf。如果您的C庫沒有asprintf,則可以使用mallocsnprintf來實現。我將這作爲一個練習。

+0

嘗試過'asprintf'它沒有解決問題,即使使用'malloc'。但'malloc'的'snprintf'可以工作。 – yarokas 2014-11-14 17:08:33

0

接受答案後。

snprintf()確定緩衝區大小。

int buf_size = snprintf(NULL, 0 , "%d-%d-%d %d:%d:%d\n", 1900+st.tm_year, 
    st.tm_mon+1, st.tm_mday, st.tm_hour, st.tm_min, st.tm_sec); 
if (buf_size < 0) { 
    Hanlde_EncodingError(); 
} 

char n[buf_size + 1]; // or char *n = malloc(buf_size + 1); 

snprintf(n, buf_size , "%d-%d-%d %d:%d:%d\n", 1900+st.tm_year, 
    st.tm_mon+1, st.tm_mday, st.tm_hour, st.tm_min, st.tm_sec);