【问题标题】:Returning a string properly in C, multiple times多次在C中正确返回字符串
【发布时间】:2017-03-02 08:32:20
【问题描述】:

好的,以下返回字符串的方法可以正常工作:

char* SU(double V) {
    static char Str[80];
    // Do something
    return Str;
}
printf("%s", SU(A));

但以下操作会静默失败,因为内存中的字符串空间在两个调用结束时是相同的:

printf("%s %s", SU(A), SU(B));

我怎样才能干净简单地做到这一点?我在看 alloca() 但我认为我不能返回分配给 alloca() 的字符串,可以吗?

【问题讨论】:

  • 为什么不在调用站点分配 2 个缓冲区并将它们传递给 SU
  • 函数可以分配内存并返回一个指向这个新分配的内存的指针。许多程序员不喜欢这种方法,因为他们认为将分配内存的函数作为释放它的函数是一种更安全的策略。
  • 我正在查看 alloca() 但我认为我不能返回分配有 alloca() 的字符串,可以吗? 。不,你不能,但使用 malloc 就可以了。

标签: c dynamic static allocation


【解决方案1】:

SU的调用序列化:

printf("%s ", SU(A));
printf("%s" , SU(B));

或者,复制返回的字符串:

char *sua = strdup(SU(A));
char *sub = strdup(SU(B));
printf("%s %s", sua, sub);
free(sua);
free(sub);

【讨论】:

    【解决方案2】:

    更改您的函数以在堆上分配一个字符串。

    char* SU(double V) {
        char* Str = malloc(80);
        // Do something
        return Str;
    }
    

    完成后不要忘记释放返回的字符串。

    char* a = SU(A);
    char* b = SU(B);
    printf("%s %s", a, b);
    free(b);
    free(a);
    

    【讨论】:

    • 是的,这行得通,但这会使调用者的事情变得复杂,我试图保持简单。
    • @dargaud 另一种使其不那么“复杂”的方法是将 Str 数组传递给函数。
    • static char* Str = malloc(80); 甚至可以编译吗?我对此非常怀疑......但即使它以某种方式发生,那么我希望 malloc 只被调用一次,在这种情况下,你对 free 的第二次调用应该会产生未定义的行为。
    【解决方案3】:

    最好将分配留给调用者。从 C 中的函数返回字符串的标准方法是通过参数:

    void SU (double V, char* str, size_t size);
    

    或者在现代 C 中你可以这样做:

    void SU (double V, size_t size, char str[static size]); 
    

    (See this)

    【讨论】:

      【解决方案4】:

      除了您提出的完全有效的解决方案之外,我还考虑了一种可以在这种情况下应用的不同方法,因为目标是将返回的字符串提供给 printf:它是使用 GNU C register_printf_function 函数来添加自定义格式字符串到 printf。

      更多信息here 和示例here for MAC addresses

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-12
        • 2014-07-15
        • 2014-06-14
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        相关资源
        最近更新 更多