我試圖用當前日期和時間返回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);
我試圖用當前日期和時間返回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);
n
是NULL
,所以你試圖複製到一個無效的內存位置。
考慮與
char n[80]; /* at least enough characters for the buffer */
,或者更適合的替換第二行返回一個字符串
char *n = (char *) malloc(80 * sizeof(char));
你需要分配內存,將指針p指出並你要去哪裏寫數據。
而不是
char *n = NULL;
你應該寫
char *n = malloc(buf_size);
接受答案後。
讓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);
OP說他們試圖*返回格式化的字符串,所以這隻會解決問題。 – zwol 2014-11-14 16:53:23
好點。相應修改。 – 2014-11-14 16:54:25
在C中,不要施加'malloc'的結果,它可以隱藏由於#include'錯誤導致的錯誤。 (雖然在C++中是必需的)。在所有C族語言中,根據定義,「sizeof(char)== 1」*因此明確寫入它是一種糟糕的代碼異味。 –
zwol
2014-11-14 17:05:54