我想写一个只返回一个字符串的函数,所以我可以这样做:
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;
}
我搜索过但无法找到这个相当常见问题的答案。有人能帮我吗?感谢。
答案 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等),自动(在堆栈上)和静态。你说你不想做任何这些,在这种情况下,我担心你运气不好。