我正在编写一个程序,但遇到以下问题:
char *tmp;
sprintf (tmp,"%ld",(long)time_stamp_for_file_name);
谁能解释一下为字符串 tmp 分配了多少内存。
一个长变量有多少个字符?
谢谢,
如果能提供有关此类信息的大量资源的链接,我将不胜感激。
谢谢
更新:
使用您的示例我遇到了以下问题:
root@-[/tmp]$cat test.c
#include <stdio.h>
int
main()
{
int len;
long time=12345678;
char *tmp;
len=snprintf(NULL,0,"%ld",time);
printf ("Lunghezza:di %ld %d\n",time,len);
return 0;
}
root@-[/tmp]$gcc test.c
root@-[/tmp]$./a.out
Lunghezza:di 12345678 -1
root@-[/tmp]$
所以 snprintf 的 len 结果是 -1,我使用标准编译器在 Solaris 9 上编译。
请帮帮我!
最佳答案
如果您的编译器符合 C99,您应该能够:
char *tmp;
int req_bytes = snprintf(NULL, 0, "%ld",(long)time_stamp_for_file_name);
tmp = malloc(req_bytes +1); //add +1 for NULL
if(!tmp) {
die_horrible_death();
}
if(snprintf(tmp, req_bytes+1, "%ld",(long)time_stamp_for_file_name) != req_bytes) {
die_horrible_death();
}
标准的相关部分(来自 draft document ):
- 7.19.6.5.2:如果n为零,什么都不写,s可能是一个空指针。
- 7.19.6.5.3:snprintf函数返回本应写入的字符数 n 是否足够大,不包括终止空字符或负数 如果发生编码错误的值。因此,以 null 结尾的输出是 当且仅当返回值是非负且小于 n 时才完全写入。
如果这不起作用,我猜你的编译器/libc 不支持 c99 的这一部分,或者你可能需要明确启用它。当我运行您的示例(使用 gcc 版本 4.5.0 20100610(预发布),Linux 2.6.34-ARCH)时,我得到了
$./example
Lunghezza:di 12345678 8
关于c - C中的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856196/