Как вернуть массив символов, созданный в функции?

Я плохо программировал в течение долгого времени, и я действительно только что понял. Ранее я создал много функций, которые возвращают символьные строки в виде массивов символов (или, по крайней мере, указатели на них).

На днях кто-то указал, что когда мои функции возвращают массивы символов, на которые указывают мои функции, они вышли из области видимости, и теперь я, по сути, указываю на случайный бит памяти (неприятный висящий указатель).

Некоторое время я не замечал этого, потому что массивы символов при выводе на консоль не выглядели поврежденными (возможно, потому, что не было времени для перезаписи этих данных). Однако я заметил это, когда возвращал строковый буфер (массив символов), сгенерированный чтением последовательного порта, который часто был поврежден.

Итак, как лучше это сделать?

Мой плохой код выглядит следующим образом:

#include <cstdlib>
#include <iostream>

using namespace std;

char* myBadFunction(){
    char charArray[] = "Some string\n";
    char* charPointer = charArray;
    return charPointer;
}


int main(int argc, char** argv) {

    cout << myBadFunction();

    return 0;
}

Я понимаю, что, возможно, мне следует выделить память в программе перед вызовом функции или создать глобальную переменную для помещения возвращаемой строки, но если моя вызываемая функция используется многими различными программами, то как она должна знать размер передаваемого буфера в это заранее, и когда эта память должна быть удалена?

Следующий код также не делает то, что я хочу, чтобы это правильно:

#include <cstdlib>
#include <iostream>

using namespace std;

void fillArray(char* charPointer){
    char charArray[] = "Some string\n"; // Create string
    charPointer = charArray; // Not correct, want to fill predefined array with created string
    return;
}


int main(int argc, char** argv) {

    char predefinedArray[50] = {0};
    fillArray(predefinedArray);
    cout << predefinedArray;

    return 0;
}

Я хочу заполнить массив, на который указывает обработанный указатель, но в коде выше этого не происходит.

Кроме того, когда я должен использовать команду new [] для создания моего массива? это нужно? и когда я должен вызвать delete [] на нем.

Большое спасибо за это, это очевидно очень фундаментально, но кое-что я делаю неправильно некоторое время.

Ответы на вопрос(4)

Ваш ответ на вопрос