猿问

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

char *recvmsg(){

    char buffer[1024];

    return buffer;

}


int main(){

    char *reply = recvmsg();

    .....

}

我收到警告:


警告C4172:返回局部变量或临时地址


慕容森
浏览 403回答 3
3回答

慕哥6287543

您需要动态分配char数组:char *recvmsg(){   char* buffer = new char[1024];   return buffer;}对于C ++和char *recvmsg(){   char* buffer = malloc(1024);   return buffer;}对于C。发生的是,没有动态分配,您的变量将驻留在函数的堆栈上,因此将在退出时被销毁。这就是为什么您会收到警告。在堆上分配它可以防止这种情况,但是一旦使用完,就必须小心并释放内存delete[]。

偶然的你

我建议std::vector<char>:std::vector<char> recvmsg(){&nbsp; &nbsp; std::vector<char> buffer(1024);&nbsp; &nbsp; //..&nbsp; &nbsp; return buffer;}int main(){&nbsp; &nbsp; 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在不需要时进行管理。

慕桂英4014372

警告消息是正确的。您将返回一个本地数组的地址,该地址在函数返回后消失。您可以使用动态内存分配来做到这一点:char *recvmsg(){&nbsp; &nbsp; char *buffer = (char*)malloc(1024);&nbsp; &nbsp; return buffer;}问题是您需要确保以后再free()使用指针,以避免内存泄漏。或者,您可以将缓冲区传递给函数。void recvmsg(char *buffer,int buffer_size){&nbsp; &nbsp; //&nbsp; write to buffer}void main(){&nbsp; &nbsp; char buffer[1024];&nbsp; &nbsp; recvmsg(buffer,1024);}这避免了内存分配的需要。实际上,这是首选的方法。
随时随地看视频慕课网APP
我要回答