我试图用当前日期和时间返回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