snprintf()中的分段错误c

时间:2014-11-14 16:49:07

标签: c char printf

我尝试使用当前日期和时间创建一个返回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);

4 个答案:

答案 0 :(得分:3)

snprintf不会为您分配缓冲区。您将n设置为NULL,因此它会愉快地尝试写入不存在的内存位置并崩溃。

您想要使用asprintf。如果您的C库没有asprintf,则可以使用mallocsnprintf来实施。我把这样做当作练习。

答案 1 :(得分:2)

nNULL,因此您尝试复制到无效的内存位置。

考虑用

替换第二行
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);