Me preguntaba por qué el siguiente código de trabajo isnt'tAsignar memoria y guardar cadena en C
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
test = "testingonly";
free(test);
}
Después de pensarlo mi suposición era que primero asignar espacio para 12 caracteres en la memoria pero la asignación en el La siguiente línea crea una matriz char en la pila y la dirección de la memoria se pasa a prueba. Entonces free() intenta liberar espacio en la pila que no está permitido. ¿Es eso correcto?
Entonces, ¿cuál sería el enfoque correcto para guardar una cadena en el montón? ¿Es la siguiente una forma común?
int main(int argc, char **argv)
{
char *test = (char*) malloc(12*sizeof(char));
strcpy(test, "testingonly");
free(test);
}
La primera solución ilustra una fuga de memoria clásica; obtienes un puntero a la memoria asignada, y luego pierdes la única referencia cuando asignas el puntero al literal de la cadena para 'test'. A partir de entonces, no hay una forma legítima para que usted haga referencia a la memoria asignada, una fuga. –
Nunca modifique el resultado de malloc en C, no tiene sentido y solo oculta los errores y las advertencias del compilador. – Lundin
sí - use 'strcpy' o' strncpy' o 'memcpy'. strncpy es mejor que strcpy, porque ayuda a evitar el problema de desbordamiento del búfer mientras se copia con un máximo de N caracteres. –