usar resueltos leer guardar funciones espacios ejercicios ejemplos con como caracteres cadenas cadena arreglo c string malloc free

resueltos - Asignar memoria y guardar cadena en c



funciones de cadenas de caracteres en c++ (6)

Me preguntaba por qué el siguiente código no funciona

int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); test = "testingonly"; free(test); }

Después de pensarlo, asumí que primero asigno espacio para 12 caracteres en la memoria, pero la asignación en la siguiente línea crea una matriz de caracteres en la pila y la dirección de la memoria que se pasa a prueba. Así que 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 el siguiente una forma común?

int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); strcpy(test, "testingonly"); free(test); }


Esto es para asignar la memoria:

char *string; string = (char *) malloc(15);

Esto es para guardar los datos:

strcpy(str, "kavitajain"); printf("String = %s, Address = %u/n", str, str);


La primera versión no crea una cadena en la pila, pero tienes razón en que no puedes free después de la asignación. Los literales de cadena generalmente se almacenan en secciones constantes / de solo lectura de la memoria. La tarea no copia nada, solo hace que la test apunte a esa área de la memoria. No puedes liberarlo. Tampoco puedes modificar esa cadena.

Su segundo código es correcto y habitual. Es posible que también desee buscar en strdup si su implementación tiene eso.


Pues tienes razón. Ahora examinemos la primera pieza de código.

char *test = (char*) malloc(12*sizeof(char));

Sobre el código no hay problemas.

test = "testingonly";

Aquí modificó la test puntero que conduce a la pérdida de memoria. Y cuando intenta liberar, no está liberando el puntero asignado real sino un literal "solo de prueba" que apunta a. Los puntos literales a la memoria constante que no se pueden anular en los escenarios habituales.

Ahora sobre el segundo fragmento de código, esto funcionará bien ya que copió explícitamente datos de donde reside literalmente para acumular donde apunta su test .

A tu segundo punto sí, strcpy es una forma habitual. Otras formas son ''memcpy'' si está copiando bytes en bruto.

NOTA: Los literales no se almacenan en la pila. Pero no se puede modificar la ubicación donde se almacenan los literales.


Ya respondiste tu pregunta. Esencialmente, strcpy es la forma apropiada de copiar cadenas.


el código

#include <stdio.h> int main(int argc, char **argv) { char *test = (char*) malloc(12*sizeof(char)); strcpy(test, "testingonly"); printf("string is: %s/n",test); free(test); return 0; }

trabajará


char *test = (char*) malloc(12*sizeof(char)); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|x|x|x|x|x|x|x|x|x|x|x|x| (uninitialized memory, heap) +-+-+-+-+-+-+-+-+-+-+-+-+ test = "testingonly"; +-+-+-+-+-+-+-+-+-+-+-+-+ test + |x|x|x|x|x|x|x|x|x|x|x|x| | +-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+ +->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+ free(test); // error, because test is no longer pointing to allocated space.

En lugar de cambiar la test puntero, debe copiar la cadena "testingonly" en el lugar asignado mediante, por ejemplo, strcpy o usar strdup . Tenga en cuenta que las funciones como malloc y strdup devuelven NULL si no hay suficiente memoria disponible y, por lo tanto, deben verificarse.

char *test = (char*) malloc(12*sizeof(char)); strcpy(test, "testingonly"); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+

o

char *test = strdup("testingonly"); +-+-+-+-+-+-+-+-+-+-+-+-+ test--->|t|e|s|t|i|n|g|o|n|l|y|0| +-+-+-+-+-+-+-+-+-+-+-+-+