如何从函数返回字符串而不在C中传递任何参数
我想编写一个只返回字符串的函数,以便执行以下操作:如何从函数返回字符串而不在C中传递任何参数,c,return,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);
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;
}
我不能做这个函数,因为如果我不记得释放调用程序中的内存,就会出现内存泄漏,这就违背了让一个简单函数返回字符字符串的目的:
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时间[9]={0};
如果(\u tstrtime\u s(时间,9)=错误\u成功)
{
INT i;
对于(i=0;i您可以使用静态
缓冲区执行此操作,如您自己的示例所示:
char *GetCurrentTime(void)
{
static char sVal[64];
GetCurrentTimeEx(sVal);
return sVal;
}
它实际上不在堆栈上分配内存,而是在静态区域。这种解决方案不是可重入的,也不是线程安全的,但它是在没有内存泄漏的情况下获得您想要的C语言的唯一方法
惯用的解决方案是让调用者负责内存分配,并将缓冲区作为参数传递。您可以使用静态
缓冲区来实现这一点,如您自己的示例所示:
char *GetCurrentTime(void)
{
static char sVal[64];
GetCurrentTimeEx(sVal);
return sVal;
}
它实际上不在堆栈上分配内存,而是在静态区域。这种解决方案不是可重入的,也不是线程安全的,但它是在没有内存泄漏的情况下获得您想要的C语言的唯一方法
惯用的解决方案是让调用者负责内存分配,并将缓冲区作为参数传递。您可以传递一个预分配的TCHAR*
,该GetCurrentTime()
将用于将时间放入:
TCHAR *GetCurrentTime(TCHAR *buf)
{
GetCurrentTimeEx(buf);
return buf;
}
这样称呼它:
TCHAR buf[64+1];
_stprintf(sVar,L"%s",GetCurrentTime(buf));
或作为
当然,这是从堆栈外分配的,您可能不希望这样。另一方面,由于它不是静态的
,它至少可以在多线程环境中重新进入。您可以传入一个预分配的TCHAR*
,该GetCurrentTime()
将用于将时间放入:
TCHAR *GetCurrentTime(TCHAR *buf)
{
GetCurrentTimeEx(buf);
return buf;
}
这样称呼它:
TCHAR buf[64+1];
_stprintf(sVar,L"%s",GetCurrentTime(buf));
或作为
当然,这是从堆栈外分配的,您可能不希望这样。另一方面,由于它不是静态的,它至少可以在多线程环境中重新进入。有三种方法可以在C中创建对象-动态(与malloc等人一起)自动(在堆栈上)静态的。你说你不想做这些,在这种情况下,恐怕你运气不好。有三种方法可以在C中创建对象-动态(与malloc等人一起)自动(在堆栈上)静态地说。你说你不想做这些事情,在这种情况下,恐怕你运气不好。你所要求的是不存在的。最接近的是拉斯曼的解决方案,尽管它有严重的缺点。如果你能接受这些。但是,更好的方法是QuantumMechanical的解决方案。注意TCHAR
,>_stprintf
、GetCurrentTime
、GetCurrentTimeEx
、DWORD
和\u tstrtime\u s
在标准C或POSIX中都没有定义。如果您自己没有定义它们(未显示)代码时,不必要地将自己锁定到所使用的实现。也不要强制转换calloc
的返回值:它不是必需的,可能会隐藏错误。为什么不传递任何参数?一个简单的void writeToMyBuffer(char*buf,int buflen)
可以完成这项工作。您可以在函数外部分配内存,只需给该区域一个指针。另一种方法是使用全局变量。如果我确实传递了一个参数,比如GetCurrentTimeEx(sTmp),会怎么样,它还返回了一个TCHAR?既然我没有理想的,我怎么能像Win32函数PathAddBackslax那样实现它?你所要求的并不存在。最接近的是larsmans的解决方案,尽管它有严重的缺点。如果你能接受这些缺点。但是,更好的方法是QuantumMechanical的解决方案。请注意TCHAR
、stprintf
、GetCurrentTime
、GetCurrentTimeEx
、DWORD
和都没有在标准C或POSIX中定义。如果您自己没有定义它们(未显示)代码时,不必要地将自己锁定到所使用的实现。也不要强制转换calloc
的返回值:它不是必需的,可能会隐藏错误。为什么不传递任何参数?一个简单的void writeToMyBuffer(char*buf,int buflen)
可以完成这项工作。您可以在函数外部分配内存,只需给该区域一个指针。另一种方法是使用全局变量。如果我确实传递了一个参数,比如GetCurrentTimeEx(sTmp),会怎么样,它还返回了一个TCHAR?既然我没有理想的,我怎么能像Win32函数PathAddBackslax那样实现它呢?如果我传递了一个参数,比如GetCurrentTimeEx(sTmp)呢,它还返回了一个TCHAR?既然我没有理想的,我怎么能像Win32函数PathAddBackslax那样实现它呢?如果我传递了一个参数,比如GetCurrentTimeEx(sTmp)呢,它还返回了一个TCHAR?既然我没有理想的,我怎么能像Win32函数PathAddBackslash那样实现它?@Jeff:因为static
意味着每个进程只有一个sval
缓冲区,所以如果两个线程几乎同时调用GetCurrentTime
,它们可能会同时写入到该缓冲区s单个缓冲区,或者其中一个可能会在返回其值之前覆盖另一个缓冲区的结果,等等@JeffR:因为static
意味着每个进程只有一个sval
缓冲区,因此如果两个线程几乎同时调用GetCurrentTime
,它们可能会同时写入该单个缓冲区,或者一个线程可能会超时在另一个返回其v之前,对其结果进行写入