[C++] Как вернуть локальный массив в C ++?


Answers

Я бы предложил 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 (как показано выше) и reply на C ++ API.

Нижняя линия: избегать использования new как можно больше. Если вы используете new , то вы должны управлять им самостоятельно, и вы должны delete когда вам это не нужно.

Question
char *recvmsg(){
    char buffer[1024];
    return buffer;
}

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

Я получаю предупреждение:

предупреждение C4172: возврат адреса локальной переменной или временного




У вас есть несколько вариантов ... То, как вы делаете это сейчас, приведет к неопределенному поведению, так как массив выйдет из области действия после возврата функции hte. Таким образом, один из вариантов заключается в динамическом распределении памяти.

char * recmsg()
{ 
   char * array = new char[128];
   return array;
}

Просто не забудьте очистить его удалением таким образом (или бесплатно, если вы использовали malloc). Во-вторых, вы можете использовать параметр ...

void recmsg(char * message, int size)
{
   if (message == 0)
      message = new char[size];
}

Опять же, то же самое происходит для очистки здесь, как и с предыдущим. Также обратите внимание на check for 0, чтобы убедиться, что вы не вызываете новый указатель, который уже был выделен.

Наконец, вы можете использовать вектор.

std::vector<char> recmsg()
{
   std::vector<char> temp;

   //do stuff with vector here

   return temp;
}



Проблема в том, что вы возвращаете указатель на буфер, выделенный в стеке. Как только функция вернется, этот буфер уже недействителен.




Проблема заключается в том, что buffer живет в стеке и выходит за рамки с момента выхода из recvmsg .

Вы можете выделить buffer в куче:

char *recvmsg(){
  char *buffer = malloc(1024);
  return buffer;
}

Обратите внимание, что теперь вызывающий абонент отвечает за распоряжение выделенной памятью:

void main(){
  char *reply = recvmsg();
  free(reply);
}



как насчет прохождения по ref

char buf[1024];
PutStuffInBuff(&buf);



char *recvmsg(){
    char *buffer = new char;
    cout<<"\nENTER NAME : ";
    cin>> buffer;
    return buffer;
}

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