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

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当您不需要它时.

  • 呵呵,OP _did_投票给c ++,所以这应该是它 (3认同)
  • OP也可以使用`std :: string`. (2认同)

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[].

  • 在C++中使用`new`并不能使它成为C++风格的解决方案.C++风格的解决方案是`std :: vector <char>`而不是原始指针`char*`. (4认同)
  • 是不是`malloc(1024*sizeof(char))`更好? (3认同)
  • @sazary首选项,sizeof char始终为1. (2认同)

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)

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

  • 我肯定不会**建议这个.在C++中,`std :: vector <char>`是更好的解决方案.这个答案暗示了C风格的解决方案,但问题是用C++标记的. (2认同)

NPE*_*NPE 6

问题是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)