如何在不传递C中的任何参数的情况下从函数返回字符串

时间:2011-04-26 11:17:35

标签: c return

我想写一个只返回一个字符串的函数,所以我可以这样做:

TCHAR sVar[256] = {0};
_stprintf(sVar,L"%s",GetCurrentTime());

我无法使用以下函数实现此功能在返回值之前释放b / c内存:

TCHAR *GetCurrentTime(void)
{
    TCHAR *sVal;
    sVal = (TCHAR *) calloc(64+1, sizeof(TCHAR));       
    GetCurrentTimeEx(sVal); // Populates
    free(sVal);sVal=NULL;
    return sVal;
}

并且我无法执行此功能,因为如果我不记得在调用程序中释放内存会导致内存泄漏,这会使得使用简单函数返回char字符串的目的失效:

TCHAR *GetCurrentTime(void)
{
    TCHAR *sVal;
    sVal = (TCHAR *) calloc(64+1, sizeof(TCHAR));
    GetCurrentTimeEx(sVal);
    return sVal;
}

我不希望从堆栈中声明内存。:

TCHAR *GetCurrentTime(void)
{
    static TCHAR sVal[64];
    GetCurrentTimeEx(sVal);
    return sVal;
}

(这是获取时间的函数):

DWORD GetTime(TCHAR *sCurrentTime)
{
    TCHAR sTime[9] = {0};
    if (_tstrtime_s(sTime, 9) == ERROR_SUCCESS)
        {
        INT i;
        for (i=0;i<=4;i++)
            sCurrentTime[i] = sTime[i];
        return 1;
        }
    else
        return 0;
}

我搜索过但无法找到这个相当常见问题的答案。有人能帮我吗?感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用static缓冲区执行此操作,如您自己的示例所示:

char *GetCurrentTime(void)
{
    static char sVal[64];
    GetCurrentTimeEx(sVal);
    return sVal;
}

实际上在堆栈上分配内存,但在静态区域中。这个解决方案不是可重入的,也不是线程安全的,但它是在没有内存泄漏的情况下在C中获得所需的确切习惯用法的唯一方法。

惯用解决方案是让内存分配成为调用者的责任,并将缓冲区作为参数传递。

答案 1 :(得分:2)

您可以传入<{strong>预先分配的 TCHAR*GetCurrentTime()会将时间用于:

TCHAR *GetCurrentTime(TCHAR *buf)
{
    GetCurrentTimeEx(buf);
    return buf;
}

这就是这样称呼的:

TCHAR buf[64+1];
_stprintf(sVar,L"%s",GetCurrentTime(buf));

或作为

TCHAR buf[64+1];
GetCurrentTime(buf);
_stprintf(sVar,L"%s",buf);

虽然当然是从堆栈中分配的,但您可能不需要。另一方面,由于它不是static,它至少会在多线程环境中重现。

答案 2 :(得分:0)

有三种方法可以在C中创建一个对象 - 动态(使用malloc等),自动(在堆栈上)和静态。你说你不想做任何这些,在这种情况下,我担心你运气不好。