La mejor manera de “declarar” cadenas en C

Soy nuevo en el mundo C (procedente de PHP). Estoy jugando con cuerdas (sé que no hay tal tipo de datos).

Mi pregunta es sobre cuál es la mejor manera de “declarar” cadenas.

Con un poco de investigación llegué a eso.

char str[40] = "Here is my text"; char str[] = "Here is my text"; char *str = "Here is my text"; 

Depende de cuales sean tus necesidades.

 char str[40] = "Here is my text"; 

Esto asignará una matriz de 40 caracteres. Los primeros 15 caracteres se establecerán de acuerdo con la cadena especificada. El rest se establecerá en nulos. Esto es útil si necesita modificar la cadena más adelante, pero sepa que no excederá los 40 caracteres (o los 39 caracteres seguidos de un terminador nulo, según el contexto).

 char str[] = "Here is my text"; 

Esto es idéntico al ejemplo anterior, excepto que ahora str está limitado a 16 caracteres (15 para la cadena + un terminador nulo).

 char *str = "Here is my text"; 

str ahora es un puntero a una cadena de 15 caracteres (más un terminador nulo). No puede modificar la cadena en sí, pero puede hacer que str point en otro lugar. En algunos entornos, esto no se aplica y puede modificar el contenido de la cadena, pero no es una buena idea. Si necesita usar un puntero y modificar la cadena, puede copiarla:

 char *str = strdup("Here is my text"); 

Pero necesitas free(str) o tu código perderá memoria.

 char str[40] = "Here is my text"; char str[] = "Here is my text"; 

str es modificable. Asi que,

 str[0] = 'M'; 

Pero,

 char *str = "Here is my text"; str[0] = 'M'; // Not possible. 

str datos de puntería de str residen en un segmento de solo lectura y no son modificables. Todo depende de lo que quieras, si la cadena debe ser modificable o no.

Yo char *str = "Here is my text";

a. La cadena se creará en la porción de memoria de solo lectura.

segundo. La variable de puntero str se creará en la porción de stack de la memoria (suponiendo que todo esto suceda dentro de una función)

do. El str apuntará a la dirección de memoria de la cadena creada en el paso ‘a’

introduzca la descripción de la imagen aquí

Por lo tanto, no puede modificar una cadena creada de esta manera ya que se crea en la porción de memoria de solo lectura. Si intenta modificar esta cadena después de crearla, la operación no está definida y obtendrá un error de tiempo de ejecución.

Una forma de superar este problema es strdup . strdup creará una copia de la cadena en la memoria del montón que le permite modificar la cadena libremente.

Por ejemplo:

 char *fruit = apple //This will be created in const portion of memory,can't modify char *copy = strdup(fruit) //This will create a copy of the string pointed by fruit in heap 

Recuerde liberar la memoria en el montón: gratis (copiar)

II . char str[40] = "Here is my text";

Esto creará una matriz de 40 caracteres. Los primeros 15 se establecerán en función del valor dado y el rest será nulo. Esto se creará en la memoria de la stack y, por lo tanto, puede modificar el valor más adelante.

por ejemplo,

 str[0] = 'T'