c - C中的动态分配

标签 c memory-management

我正在编写一个程序,但遇到以下问题:

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/

相关文章:

c - Openmp 'shared’ 对‘#pragma omp 无效

c - 当我试图使数组溢出时 gcc 做了什么?

c++ - 英特尔 TBB 内存分配器的性能?

C++ 自定义内存管理使用 brk() 系统调用分配内存?

bash - 如何在 MAC OSX 上限制程序内存使用的示例

ios - Xcode Instruments 中的总字节数达到 1 GB 可以吗?

c - 处理十进制数的转换

从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行

c - 从 net-snmp C 包运行 snmpget 时出错

Java 在释放对象和垃圾回收后仍然使用系统内存