为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C ++中返回本地数组?

如何在C ++中返回本地数组?

C++
慕容森 2019-12-03 16:25:14
char *recvmsg(){    char buffer[1024];    return buffer;}int main(){    char *reply = recvmsg();    .....}我收到警告:警告C4172:返回局部变量或临时地址
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您需要动态分配char数组:


char *recvmsg(){

   char* buffer = new char[1024];

   return buffer;

}

对于C ++和


char *recvmsg(){

   char* buffer = malloc(1024);

   return buffer;

}

对于C。


发生的是,没有动态分配,您的变量将驻留在函数的堆栈上,因此将在退出时被销毁。这就是为什么您会收到警告。在堆上分配它可以防止这种情况,但是一旦使用完,就必须小心并释放内存delete[]。


查看完整回答
反对 回复 2019-12-03
?
偶然的你

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在不需要时进行管理。


查看完整回答
反对 回复 2019-12-03
?
慕桂英4014372

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);

}

这避免了内存分配的需要。实际上,这是首选的方法。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 368 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信