22 c++ return-type char
char *recvmsg(){
char buffer[1024];
return buffer;
}
int main(){
char *reply = recvmsg();
.....
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
警告C4172:返回局部变量的地址或临时变量
Naw*_*waz 27
我建议std::vector<char>:
std::vector<char> recvmsg()
{
std::vector<char> buffer(1024);
//..
return buffer;
}
int main()
{
std::vector<char> reply = recvmsg();
}
Run Code Online (Sandbox Code Playgroud)
然后,如果您需要char*使用代码,那么您可以&reply[0]随时使用.例如,
void f(const char* data, size_t size) {}
f(&reply[0], reply.size());
Run Code Online (Sandbox Code Playgroud)
而且你已经完成了.这意味着,如果您正在使用C API,那么您仍然可以使用std::vector,因为您可以传递&reply[0]给C API(如上所示)和replyC++ API.
底线是:尽量避免使用new.如果您使用new,那么您需要自己管理它,并且delete当您不需要它时.
Luc*_*ore 13
您需要动态分配您的char数组:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
对于C++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
为C.
所发生的是,没有动态分配,您的变量将驻留在函数的堆栈上,因此将在退出时销毁.这就是你得到警告的原因.在堆上分配它可以防止这种情况,但是一旦完成它就必须小心并释放内存delete[].
Mys*_*ial 10
警告信息是正确的.您将返回一个本地数组的地址,该函数在函数返回后消失.
您可以使用动态内存分配执行此操作:
char *recvmsg(){
char *buffer = (char*)malloc(1024);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
问题是您需要free()稍后确保指针以避免内存泄漏.
或者,您可以将缓冲区传递给函数.
void recvmsg(char *buffer,int buffer_size){
// write to buffer
}
void main(){
char buffer[1024];
recvmsg(buffer,1024);
}
Run Code Online (Sandbox Code Playgroud)
这避免了对内存分配的需要.这实际上是首选方法.
问题是buffer生存在堆栈上并在退出时超出范围recvmsg.
你可以buffer在堆上分配:
char *recvmsg(){
char *buffer = malloc(1024);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
请注意,现在调用者负责处理已分配的内存:
void main(){
char *reply = recvmsg();
free(reply);
}
Run Code Online (Sandbox Code Playgroud)