He estado programando mal por bastante tiempo y solo me acabo de dar cuenta. Anteriormente creé muchas funciones que devuelven cadenas de caracteres como matrices de caracteres (o al menos sugerencias para ellas).¿Cómo devolver una matriz de caracteres creados en la función?
El otro día alguien señaló que cuando mis funciones regresan, las matrices de caracteres señaladas por mis funciones han salido del ámbito y esencialmente ahora estoy apuntando a un poco de memoria aleatoria (un puntero colgante desagradable).
No me di cuenta de esto por un tiempo porque las matrices de caracteres cuando salían a la consola no parecían estar dañadas (probablemente porque no había tiempo para sobrescribir esos datos). Sin embargo, me di cuenta de esto cuando estaba devolviendo un búfer de cadena (matriz de caracteres) generado al leer el puerto serie que con frecuencia estaba dañado.
Entonces, ¿qué mejor debería hacerlo?
Mi mal código es el siguiente:
#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;
}
entiendo que tal vez debería asignar memoria en el programa antes de llamar a la función o crear una variable global para poner la cadena devuelta, pero si mi función llamada es utilizado por muchos programas diferentes, ¿cómo debería saber el tamaño del búfer que se está transfiriendo con anterioridad y cuándo debería eliminarse?
El siguiente código también no hace lo que yo quiero que correctamente:
#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;
}
Quiero llenar la matriz que analiza el puntero puntos a, pero ésto no' sucede en el código de seguridad.
Además, ¿cuándo debería usar el nuevo comando [] para crear mi matriz? es necesario? y cuando debería llamar delete [] en él.
Muchas gracias por esto, es obviamente muy fundamental, pero algo que he estado haciendo mal desde hace un tiempo.
es mejor que agregue el tipo de código que escribe en las etiquetas. – Stefanvds
En cuanto a la segunda parte de su pregunta, deberá usar el bucle manual y copiar cada carácter en la segunda matriz o usar 'memcpy' ... – st0le