我正在使用一个返回char *的函数,现在我收到编译器警告“返回局部变量或临时地址”,所以我想我必须使用静态var作为返回,我的问题是否可以使if(var已设置)返回var else do do function并返回var?
这是我的功能:
char * GetUID()
{
TCHAR buf[20];
StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"),
someFunction());
return buf;
}
这就是我想要做的事情:
char * GetUID()
{
static TCHAR buf[20];
if(strlen(buf)!=0) return buf;
StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"),
someFunction());
return buf;
}
这是静态变量的好用吗?我应该使用 ZeroMemory(& buf,20 * sizeof(char))?我删除它是因为如果我在if(strlen ...)之上使用它,我的TCHAR长度永远不会为0,我应该在下面使用它吗?
答案 0 :(得分:4)
您收到警告的原因是因为函数退出后,函数中为buf分配的内存将从堆栈中弹出。如果返回指向该内存地址的指针,则指向未定义的内存。它可能会起作用,也可能不起作用 - 无论如何都不安全。
通常,C / C ++中的模式是分配一块内存并将指向该块的指针传递给您的函数。 e.g。
void GetUID( char* buf )
{
if(strlen(buf)!=0) return;
StringCchPrintf(buf, 20*sizeof(char), TEXT("%s"), someFunction());
}
如果您希望函数(GetUID)本身处理缓存结果,那么您可以使用静态,单例(OOP)或考虑thread local storage。 (例如在Visual C ++中)
__declspec(thread) TCHAR buf[20];
答案 1 :(得分:3)
如果你的代码是单线程的,那没关系。当第一次输入函数时,缓冲区将被设置为包含全零,因此不需要将其内容显式设置为零。但是现在所有的代码最终都会变成多线程的,所以如果我是你,我就不会这样做。
答案 2 :(得分:2)
您应该做的是使用buf
动态分配new
,然后将其返回。但请注意,调用者将负责释放内存。
更好的是,使用std::string
代替char *
。
答案 3 :(得分:1)
你可以这样做,但它不是线程安全的。您还应该小心处理结果,因为您无法在后续的函数调用之间存储它(当然不复制它)。
您还应该将静态变量初始化为空字符串。
答案 4 :(得分:0)
我就是这样做的。 它缓存;它不依赖于缓冲区为0。
它确实有一个隐含的假设,'buf'在线程之间是相同的,这是不(据我所知)正确。我会为此目的使用全局。
//returns a newly allocated buffer, every time. remember to delete [] it.
char * GetUID()
{
static TCHAR buf[20];
static bool run = false;
TCHAR ret_mem = new TCHAR[20];
if(run)
{ return ret_mem; }
//do stuff to the buf
//assuming - dst, src, size.
memcpy(ret_mem, buf, 20);
run = true;
return ret_mem;
}