Cuando compilar y ejecutar siguiente programa C en mi máquina Linux x86_64, compilado por GCC:¿Dónde se almacenan las constantes de cadena almacenadas por GCC y desde dónde se asignan estos punteros?
#include <stdio.h>
int main(void)
{
char *p1 = "hello"; // Pointers to strings
char *p2 = "hello"; // Pointers to strings
if (p1 == p2) { // They are equal
printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c
// This is always the output on my machine
}
else {
printf("NotEqual %p %p\n", p1, p2);
}
}
siempre me dan el resultado como:
igual 0x40064c 0x40064c
I comprende que las cadenas se almacenan en una tabla constante, pero la dirección es demasiado baja en comparación con la memoria asignada dinámicamente.
Comparar con siguiente programa:
#include <stdio.h>
int main(void)
{
char p1[] = "hello"; // char arrar
char p2[] = "hello"; // char array
if (p1 == p2) {
printf("equal %p %p\n", p1, p2);
}
else { // Never equal
printf("NotEqual %p %p\n", p1, p2); // NotEqual 0x7fff4b25f720 0x7fff4b25f710
// Different pointers every time
// Pointer values too large
}
}
Los dos punteros no son iguales, ya que estos son dos matrices que pueden ser manipulados de forma independiente.
Quiero saber cómo GCC genera el código para estos dos programas y cómo se asignan a la memoria durante la ejecución. Como esto ya estaría documentado, muchas veces los enlaces a la documentación también son bienvenidos.
Siempre podría centrarse en el desmontaje. Es una buena habilidad para desarrollar, tendrás que volver a hacerlo en el futuro. –
Solo hay dos cadenas en su código de ejemplo: 'igual% p% p \ n' y' NotEqual% p% p \ n'. 'p1' y' p2' son solo variables de matriz de caracteres inicializadas a algún valor, que luego se utiliza como una cadena. En particular, aún puede hacer 'p1 [0] = 'H'; p2 [0] = 'J'; 'por ejemplo, sin ningún problema. Si desea que 'p1' y' p2' sean constantes de cadena, use 'static const char p1 [] =" Hello ";'. Al menos GCC-4.6.3 trata las matrices de const locales como variables, no como constantes de solo lectura verdaderas, por lo que se necesita 'static '. Y no fusiona cadenas, por lo que los dos tienen punteros distintos. ¿Qué compilador estás usando? –