2014-11-14 87 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);