c - 在C中返回一个 "static char[]"的字符串好不好?

标签 c string

我有一组函数都像这样构建一个日志字符串:

...
// Top level snprintf call
snprintf(buffer, BUFSIZ, "%s %s %s", dump_1(obj), dump_2(obj), dump_3(obj));
...

static char *dump_1(my_own_type_t obj)
{
        static char t1[BUFSIZ];
        // Logic printing obj data into t1
        return t1;
}

static char *dump_2(my_own_type_t obj)
{
        static char t2[BUFSIZ];
        // Logic printing obj data into t2
        return t2;
}

static char *dump_3(my_own_type_t obj)
{
        static char t3[BUFSIZ];
        // Logic printing obj data into t3
        return t3;
}

这是实现此目标的好方法,还是有更好的方法来实现同样的目标?我可以改用动态分配的字符串,但是我必须添加内存管理,这会使代码更加复杂。我也可以传递缓冲区,然后直接写入缓冲区,但这意味着需要进行大量额外的 snprintf 调用,因为每次我想向字符串中添加内容时都必须调用 snprintf。

编辑: 在我的例子中,线程安全不是问题,并且日志记录调用不可重入。所以从理论上讲,我可以让事情保持原样。但是,根据 mcleod_ideafix 的建议,以某种方式感觉更干净。这样我就不需要任何静态变量,而且我仍然会将 snprintf 调用保持在最低限度。唯一的缺点是声明了很多本地缓冲区,但我觉得在我的情况下这是可以管理的。非常感谢所有反馈。

最佳答案

只要您意识到它使函数不可重入,返回指向静态的指针就可以了。所以,例如,

snprintf(buffer, BUFSIZ, "%s %s", dump_1(obj1), dump_1(obj2));

会失败,因为对 dump_1() 的两次调用会干扰,并且可能不会按照您期望的顺序调用。此外,您将无法在线程代码中使用这些函数。通用字符串函数的最佳做法是将输出字符串和大小作为参数传递,就像 snprintf 一样。

关于c - 在C中返回一个 "static char[]"的字符串好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20851012/

相关文章:

c - 任何数据结构的大小都可以被 int 的大小整除吗?

c - 代码修改后,Microblaze 上的运行时间有所不同

c - 根据子字符串查找删除列表条目

c# - 如何有效地将巨大的字符串添加到文本框?

将静态文件编译成可执行文件

C++:如何解决隐式声明编译错误?

c# - 无法从字符串中收集子字符串

javascript - PHP 使用 file_get_contents 从 .txt 文件中获取最后五个单词

ruby - 如何在 Ruby 中安全且可逆地转义字符串引号?

java - Captain crunch - ROT13编码器程序