malloc()
asignará un bloque de memoria y devolverá un puntero a esa memoria si tiene éxito, y NULL si no tiene éxito. el tamaño del bloque de memoria se especifica mediante el argumento malloc
, en bytes. El operador sizeof
da el tamaño de su argumento en bytes.
char *someString = malloc(sizeof(char) * 50)
esto va a asignar suficiente espacio para una cadena de 49 caracteres (una cadena de estilo C debe terminarse con un valor NULL ('\0'
) caracteres) sin incluir el carácter nulo, y el punto someString
en esa memoria.
Parece que el código en su pregunta debe ser malloc(sizeof(char) * 2);
, ya que sizeof(char) + 2
no tiene sentido.
tenga en cuenta que sizeof(char)
es siempre igual a 1 (byte) - pero la representación de memoria de otros tipos (como long) puede variar entre los compiladores.
La forma en que obtiene (no) la suerte con la memoria asignada dinámicamente es si intenta leer/escribir fuera de la memoria que ha asignado.
Por ejemplo,
char *someString = malloc(10);
strcpy(someString, "Hello there, world!");
printf("%s\n", someString);
La primera línea asigna suficiente espacio para 9 caracteres y un carácter nulo.
La segunda línea intenta copiar 20 caracteres (19 + NULO) en ese espacio de memoria. Esto sobrepasa el búfer y puede causar algo increíblemente ingenioso, como sobrescribir la memoria adyacente o causar una segfault.
La tercera línea podría funcionar, por ejemplo, si había memoria asignada justo al lado de someString, y "¡Hola, mundo!" topado con ese espacio de memoria, podría imprimir su cadena más lo que haya en el siguiente espacio de memoria. Si ese segundo espacio terminara NULL, se detendría, a menos que no lo fuera, en cuyo caso se desviaría y eventualmente segfault.
Este ejemplo es una operación bastante simple, pero es tan fácil equivocarse. C es complicado, ten cuidado.
¿Por qué todas las formas de asignar espacio suficiente aspiran? ¡NO HAY FORMA FÁCIL! – Kredns
Las cadenas son la parte más fragmentada de C. Recomiendo codificar una estructura de pseudo-OO 'StringBuilder' o similar, y crear p. StrBufPrintf, StrBufGets, StrBufScanf, etc. para centralizar este tipo de operaciones. La biblioteca C estándar no ayuda mucho. C++ es un poco mejor, porque generalmente tiene 10 de diferentes clases de cadenas para elegir, una para cada marco distinto que se utiliza. Sí, estoy siendo sarcástico. –
La manera fácil es usar (1) un idioma donde una cadena es un tipo básico; (2) use una biblioteca que proporciona un comportamiento de cadena; o (3) aprende el idioma que estás usando. Si no quiere aprender a usar las herramientas, ¿por qué lo intenta? Encuentre otro idioma que sea más adecuado para usted (no estoy tratando de insultar aquí, solo pragmático). – paxdiablo