Comparación de cadenas C con señal igual

Tengo este código:

char *name = "George" if(name == "George") printf("It's George") 

Pensé que las cadenas c no podrían ser comparadas con == sign y tendré que usar strcmp . Por razones desconocidas cuando compilo con gcc (versión 4.7.3), este código funciona. Pensé que esto estaba mal porque es como comparar punteros, así que busqué en google y mucha gente dice que está mal y que no se puede comparar con == . Entonces, ¿por qué funciona este método de comparación?

Pensé que las cadenas c no podrían ser comparadas con el signo == y que tengo que usar strcmp

Derecha.

Pensé que esto era incorrecto porque es como comparar punteros, así que busqué en google y muchas personas dicen que está mal y no se puede comparar con ==

Eso es correcto también

Entonces, ¿por qué funciona este método de comparación?

No “funciona”. Solo parece estar funcionando.

La razón por la que esto sucede es probablemente una optimización del comstackdor: los dos literales de cadena son idénticos, por lo que el comstackdor realmente genera solo una instancia de ellos, y usa ese mismo puntero / matriz cada vez que se hace referencia al literal de cadena.

Solo para proporcionar una referencia a la respuesta de @ H2CO3:

C11 6.4.5 Literales de cadenas

No se especifica si estas matrices son distintas siempre que sus elementos tengan los valores adecuados. Si el progtwig intenta modificar dicha matriz, el comportamiento no está definido.

Esto significa que en su ejemplo, el name (un literal de cadena “George”) y "George" pueden y no pueden compartir la misma ubicación, depende de la implementación. Así que no cuente con esto, puede tener resultados diferentes en otras máquinas.

La comparación que ha hecho compara la ubicación de las dos cadenas, en lugar de su contenido. Sucede que su comstackdor decidió crear solo una cadena literal que contenga los caracteres "George" . Esto significa que la ubicación de la cadena almacenada en el name y la ubicación del segundo "George" son las mismas, por lo que la comparación devuelve un valor distinto de cero.

No obstante, no es necesario que el comstackdor haga esto: podría crear fácilmente dos literales de cadena diferentes, con diferentes ubicaciones pero con el mismo contenido, y la comparación devolvería cero.

Esto fallará, ya que está comparando dos punteros diferentes de dos cadenas separadas. Si este código aún funciona, entonces esto es el resultado de una gran optimización de GCC, que guarda solo una copia para la optimización del tamaño.

Use strcmp() . Enlace .

Si compara dos picaduras, está comparando direcciones base de esas cadenas, no caracteres reales en esas cadenas. para comparar cadenas utilice las funciones de la biblioteca strcmp() y strcasecmp() o escriba un progtwig como este. a continuación no es un código completo, solo se requiere lógica para la comparación de cadenas.

 void mystrcmp(const char *source,char *dest) { for(i=0;source[i] != '\0';i++) dest[i] = source[i]; dest[i] = 0; }