char *recvmsg(){
char buffer[1024];
return buffer;
}
int main(){
char *reply = recvmsg();
.....
}
我得到一个警告:
警告C4172:返回局部变量或临时
的地址
发布于 2011-10-14 23:36:18
您需要动态分配char数组:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
对于C++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
对于C.
发生的情况是,如果没有动态分配,您的变量将驻留在函数的堆栈中,因此在退出时将被销毁。这就是为什么你会收到警告。在堆上分配它可以避免这种情况,但是一旦通过delete[]
使用它,您就必须小心并释放内存。
发布于 2011-10-14 23:38:58
我建议使用std::vector<char>
std::vector<char> recvmsg()
{
std::vector<char> buffer(1024);
//..
return buffer;
}
int main()
{
std::vector<char> reply = recvmsg();
}
然后,如果您的代码中需要char*
,那么您可以随时使用&reply[0]
。例如,
void f(const char* data, size_t size) {}
f(&reply[0], reply.size());
你就完事了。这意味着,如果您正在使用can,那么您仍然可以使用std::vector
,因为您可以将&reply[0]
传递给can (如上所示),将reply
传递给C++ API。
底线是:尽量避免使用new
。如果你使用new
,那么你必须自己管理它,当你不需要它的时候,你必须使用delete
。
发布于 2011-10-14 23:35:54
警告消息是正确的。您返回的是一个本地数组的地址,该数组在函数返回后消失。
您可以使用动态内存分配来完成此操作:
char *recvmsg(){
char *buffer = (char*)malloc(1024);
return buffer;
}
问题是,您需要确保稍后对指针执行free()
操作,以避免内存泄漏。
或者,您可以将缓冲区传递给函数。
void recvmsg(char *buffer,int buffer_size){
// write to buffer
}
void main(){
char buffer[1024];
recvmsg(buffer,1024);
}
这就避免了对内存分配的需要。这实际上是一种更好的方式。
https://stackoverflow.com/questions/7769998
复制相似问题