Leer diferencia entre char *str y char str[] y como se almacena tanto en la memoria?
–Grijesh Chauhan
6 de septiembre de 2013 a las 5:38
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
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.
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
c-faq.com/decl/strlitinit.html
– cnicutar
25 de agosto de 2012 a las 12:01
cs.bu.edu/teaching/cpp/string/array-vs-ptr
– amichhajer
25 de agosto de 2012 a las 12:02
Leer diferencia entre
char *str
ychar str[]
y como se almacena tanto en la memoria?–Grijesh Chauhan
6 de septiembre de 2013 a las 5:38