Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从函数返回字符串而不在C中传递任何参数_C_Return - Fatal编程技术网

如何从函数返回字符串而不在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之前,对其结果进行写入