3 回答
![?](http://img1.sycdn.imooc.com/5333a1d100010c2602000200-100-100.jpg)
TA贡献1831条经验 获得超10个赞
您需要动态分配char数组:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
对于C ++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
对于C。
发生的是,没有动态分配,您的变量将驻留在函数的堆栈上,因此将在退出时被销毁。这就是为什么您会收到警告。在堆上分配它可以防止这种情况,但是一旦使用完,就必须小心并释放内存delete[]。
![?](http://img1.sycdn.imooc.com/545845b40001de9902200220-100-100.jpg)
TA贡献1841条经验 获得超3个赞
我建议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());
这样就完成了。这意味着,如果您使用的是C API,则仍然可以使用std::vector,因为您可以传递&reply[0]给C API(如上所示)和replyC ++ API。
底线是:尽量避免使用new。如果使用new,则必须自己进行管理,并且delete在不需要时进行管理。
![?](http://img1.sycdn.imooc.com/545868190001d52602200220-100-100.jpg)
TA贡献1871条经验 获得超13个赞
警告消息是正确的。您将返回一个本地数组的地址,该地址在函数返回后消失。
您可以使用动态内存分配来做到这一点:
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);
}
这避免了内存分配的需要。实际上,这是首选的方法。
- 3 回答
- 0 关注
- 402 浏览
添加回答
举报