Diferencia entre char *str = “…” y char str[N] = “…”? [duplicate]

5 minutos de lectura

Diferencia entre char str … y char strN
Rogi

Posible duplicado:

¿Cuál es la diferencia entre char s[] y char *s en C?
Pregunta sobre punteros y cadenas en C

Estoy leyendo sobre las cadenas en C y estoy confundido. Puedo “declarar” cadenas de dos maneras:

char *str = "This is string";
char str2[20] = "This is string"; 

¿Cuál es la diferencia entre las dos declaraciones? cuando deberia char str2[20] ser preferido sobre char *str?

Diferencia entre char str … y char strN
José

En C, las cadenas se representan como secuencias de chars, con un carácter NULL (también conocido como 0, '\0'). Se almacenan en la memoria y se trabaja con una forma de referenciarla. Ha identificado las dos formas de hacer referencia a ella, una char *que es un puntero a una secuencia de chars y una matriz, que es una cadena inmediata de caracteres como una variable real. Tenga en cuenta que la cadena “abc” es 4 bytes siempre que haya un carácter NULL adicional para representar el final de la cadena.

Además de esto, en realidad está asignando cadenas en el ejemplo, lo que también implica que las cadenas se den en tiempo de compilación.

Así que dos preguntas. Primero se trata de cómo representa cadenas (char * contra char[]) el segundo es sobre cadenas en tiempo de compilación.

Para llegar a tus ejemplos:

El primero uno crea una cadena constante en el texto del programa y un puntero al mismo. Dependiendo del compilador, puede almacenarse en cualquier lugar. es el equivalente de mallocing una cadena y almacenar un puntero a ella, excepto que no debe cambiar el contenido de la memoria. Es un char *por lo que puede cambiar el puntero para que apunte a otro lugar, como otro malloced cadena o al comienzo de una matriz que definió en el ejemplo 2.

El segundo crea una matriz de caracteres (que es una forma de representar una cadena). La matriz se almacena y asigna en la pila durante la duración de la función, y puede cambiar el contenido. Debido a que no es un puntero, no puede cambiarlo para que apunte a una cadena diferente.

  • En otras palabras, la primera declaración crea una cadena inmutable mientras que la segunda es mutable.

    – Rogi

    25 de agosto de 2012 a las 12:04

  • no, eso es posible cambiar la cadena si lo desea (puede hacer casi cualquier cosa en C). Pero tu no debe! Son solo formas diferentes de crear una cadena. Debe leer sobre la asignación de memoria para comprender mejor.

    – José

    25 de agosto de 2012 a las 12:05


  • +diez mil por “puedes hacer casi cualquier cosa en C, ¡Pero no debes!

    – Chani

    25 de agosto de 2012 a las 12:09

  • ¡Preferiría que hicieras clic en el voto positivo 9999 veces que 10 000!

    – José

    25 de agosto de 2012 a las 12:15

  • ¿Pueden los votantes negativos dar razones para votar negativamente?

    – José

    27 de agosto de 2012 a las 17:31

1647645188 402 Diferencia entre char str … y char strN
cerebro peligroso

char *str = "This is string";

Pone la cuerda en el constant data section (also known as .rdata) del programa. Estos datos no se pueden modificar.

char str2[20] = "This is string";

En este tipo de declaración los datos son preferentemente stored in the stack area del programa, si se declara dentro del function scope y en data section si se declara en global scope.Estos datos pueden ser modificados.

Entonces, si tiene la necesidad de modificar los datos, use el segundo enfoque.

  • ¿Puedes explicar dónde dije eso? char *str = ".." Qué es la asignación de tiempo de ejecución? Creo que leyó mal mi respuesta (por error o deliberadamente).

    – José

    27 de agosto de 2012 a las 12:40

C no tiene cadenas. todo lo que hay es char arreglos Y las matrices en C son solo punteros al primer elemento.

La forma más fácil de hacerlo es, de hecho, su primera variante. No especificar una longitud explícita de la matriz para los literales evitará que accidentalmente hagas algo como

char[3] = "abc";

Las cadenas C son constantes en la memoria, por lo que:

char *str = "This is string";

Almacena “Esta es una cadena” en la memoria y no es mutable, solo puede asignar otra dirección a str.

Sin embargo

char str2[20] = "This si string"; 

es una abreviatura de

char String2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'};

que no almacena una cadena en la memoria, almacena bytes independientes.

Si desea usar cadenas constantes como mensajes, use la primera línea. Si desea usar y manipular cadenas como en un procesador de textos, use el segundo.

Saludos

char *str = "This is string"; – Esto mantendrá la cadena en el segmento de texto como datos de solo lectura y almacenará la dirección en la variable de puntero local str.

str[0] = 'a'; //This will leads to crash, because strings are in read only segment.
printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c)

char str2[20] = "This is string"; – Esto mantendrá la cadena como matriz de caracteres en la pila local.

str2[0] = 'a'; //This will change the first character to a
printf("%d",sizeof(str2)); //This will print 20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad