首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中返回本地数组?

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

Stack Overflow用户
提问于 2011-10-14 23:34:22
回答 12查看 58.1K关注 0票数 24
代码语言:javascript
复制
char *recvmsg(){
    char buffer[1024];
    return buffer;
}

int main(){
    char *reply = recvmsg();
    .....
}

我得到一个警告:

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

的地址

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-10-14 23:36:18

您需要动态分配char数组:

代码语言:javascript
复制
char *recvmsg(){
   char* buffer = new char[1024];
   return buffer;
}

对于C++和

代码语言:javascript
复制
char *recvmsg(){
   char* buffer = malloc(1024);
   return buffer;
}

对于C.

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

票数 14
EN

Stack Overflow用户

发布于 2011-10-14 23:38:58

我建议使用std::vector<char>

代码语言:javascript
复制
std::vector<char> recvmsg()
{
    std::vector<char> buffer(1024);
    //..
    return buffer;
}
int main()
{
    std::vector<char> reply = recvmsg();
}

然后,如果您的代码中需要char*,那么您可以随时使用&reply[0]。例如,

代码语言:javascript
复制
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

票数 29
EN

Stack Overflow用户

发布于 2011-10-14 23:35:54

警告消息是正确的。您返回的是一个本地数组的地址,该数组在函数返回后消失。

您可以使用动态内存分配来完成此操作:

代码语言:javascript
复制
char *recvmsg(){
    char *buffer = (char*)malloc(1024);
    return buffer;
}

问题是,您需要确保稍后对指针执行free()操作,以避免内存泄漏。

或者,您可以将缓冲区传递给函数。

代码语言:javascript
复制
void recvmsg(char *buffer,int buffer_size){
    //  write to buffer
}

void main(){
    char buffer[1024];
    recvmsg(buffer,1024);
}

这就避免了对内存分配的需要。这实际上是一种更好的方式。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7769998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档