我尝试使用当前日期和时间创建一个返回char *
的函数。但是我在使用snprintf时得到了分段错误。
这是代码的一部分。
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);
答案 0 :(得分:3)
snprintf
不会为您分配缓冲区。您将n
设置为NULL
,因此它会愉快地尝试写入不存在的内存位置并崩溃。
您想要使用asprintf
。如果您的C库没有asprintf
,则可以使用malloc
和snprintf
来实施。我把这样做当作练习。
答案 1 :(得分:2)
n
为NULL
,因此您尝试复制到无效的内存位置。
考虑用
替换第二行char n[80]; /* at least enough characters for the buffer */
或者,更适合返回字符串
char *n = ( char * ) malloc( 80 * sizeof( char ) );
答案 2 :(得分:1)
您需要分配指针p指向的内存以及您要写入数据的位置。
而不是
char *n = NULL;
你应该写
char *n = malloc( buf_size );
答案 3 :(得分: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);