Как вернуть массив символов, созданный в функции?
Я плохо программировал в течение долгого времени, и я действительно только что понял. Ранее я создал много функций, которые возвращают символьные строки в виде массивов символов (или, по крайней мере, указатели на них).
На днях кто-то указал, что когда мои функции возвращают массивы символов, на которые указывают мои функции, они вышли из области видимости, и теперь я, по сути, указываю на случайный бит памяти (неприятный висящий указатель).
Некоторое время я не замечал этого, потому что массивы символов при выводе на консоль не выглядели поврежденными (возможно, потому, что не было времени для перезаписи этих данных). Однако я заметил это, когда возвращал строковый буфер (массив символов), сгенерированный чтением последовательного порта, который часто был поврежден.
Итак, как лучше это сделать?
Мой плохой код выглядит следующим образом:
#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 [] на нем.
Большое спасибо за это, это очевидно очень фундаментально, но кое-что я делаю неправильно некоторое время.