2012-05-11 23 views
5

Eventuali duplicati:
How are string literals compiled in C?confronto Indirizzo e stoccaggio stringa

ho scritto il piccolo codice qui sotto. In questo codice, penso che l'indirizzo della prima e della seconda stringa "ciao" verrebbe confrontato. Sono confuso in questo. A prima vista, pensavo che entrambe le stringhe sarebbero state memorizzate nella memoria di sola lettura e avrebbero quindi un indirizzo diverso. Ma "uguale" è stato stampato dopo l'esecuzione.

Quando ho visto l'objdump, non ero in grado di vedere la stringa ciao. Capisco che non ho preso una variabile per memorizzarli, ma dove sarebbe "salvato".

Sarà memorizzato su STACK ?? o Sarà memorizzato nel segmento di codice ??

#include<stdio.h> 
int main() 
{ 
    if ("hello" == "hello") 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 
    return 0; 
} 

Quando ho cambiato la condizione if if ("hello" == "hell1"), "diverso" ha ottenuto stampato. Ancora, dove e come vengono memorizzate le stringhe. Sarà memorizzato su STACK ?? o Sarà memorizzato nel segmento di codice ??

Sarei davvero grato se qualcuno qui mi fornisca una risposta elaborata. Grazie

+0

Se si vede lo smontaggio di questo, si noterà che non esiste affatto un equivalente 'se'! Ottimizzato! –

+0

possibile duplicato di [Una domanda di base: come vengono compilati i valori letterali stringa in C?] (Http://stackoverflow.com/q/6680819/), [Perché "a"! = "A" in C?] (Http : //stackoverflow.com/q/4843640/), [C string letterali: dove vanno?] (http://stackoverflow.com/q/2589949/) – outis

risposta

3

Nel tuo particolare esempio, le stringhe "ciao" non fanno nemmeno parte del codice. Il compilatore è abbastanza intelligente da rilevare che il codice sarà sempre e per sempre stampato "uguale" così da eliminarlo completamente.

Se il codice si presentava così, però:

#include<stdio.h> 
int main() 
{ 
    const char *h1 = "hello"; 
    const char *h2 = "hello"; 
    if (h1 == h2) 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 
    return 0; 
} 

Lo faresti ancora ottenere "uguali", anche se, tuttavia, il confronto sarà effettivamente fatto (se compilato senza ottimizzazioni in più). È un'ottimizzazione: il compilatore ha rilevato che hai due stringhe identiche e codificate e le hai unite nel binario risultante.

considerando che, se il codice si presentava così, il compilatore non sarebbe in grado di indovinare (per impostazione predefinita) che sono la stessa cosa, e vedrete il messaggio "diverso":

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main() 
{ 
    char *h1 = malloc(sizeof(char) * 10); 
    char *h2 = malloc(sizeof(char) * 10); 

    strcpy(h1, "hello"); 
    strcpy(h2, "hello"); 

    if (h1 == h2) 
     printf("\n equal "); 
    else 
     printf("\n not equal"); 

    free(h1); 
    free(h2); 

    return 0; 
} 
+0

Anche senza ottimizzazione, una sorta di ottimizzazione ha avuto luogo nel codice che mostri. Sia 'h1' che' h2' puntano allo stesso locn. Penso che non possiamo impedire il compilatore dalle ottimizzazioni di base anche a 'O0'? Non sono sicuro che sia stato il –

+0

@PavanManjunath a ristrutturare il mio post per renderlo più chiaro. –

+0

Poiché si tratta di un confronto tra indirizzi, in che modo il compilatore può ottimizzare il codice in base all'assunzione del confronto tra stringhe? –

0

Stringhe letterali, poiché i tuoi due "hello" possono essere realizzati in memoria di sola lettura dal compilatore e inoltre ha il diritto di realizzarne uno solo se il valore coincide.

Quindi il risultato del confronto è definito dall'implementazione e potrebbe persino variare a seconda delle versioni dello stesso compilatore o delle diverse opzioni di ottimizzazione fornite.

+0

In realtà, nel suo esempio, "ciao" non è memorizzato in '.TEXT' affatto. Ma sei corretto per il codice modificato nel mio post. –

+0

@ MahmoudAl-Qudsi, per il compilatore questo potrebbe essere il caso o meno. Questo è un dettaglio di implementazione della piattaforma, diversi compilatori faranno diversamente. –

1

se due stringhe confrontate, se uguali, come "ciao" == "ciao", non c'è alcun paragone nel principale, come ha detto Pavan Manjunath. montaggio come segue:

 
    .file "hello.c" 
    .section .rodata 
.LC0: 
    .string "\n equal " 
    .text 
.globl main 
    .type main, @function 

ma se questi due stringa non è uguale, come "Hello2" == "ciao", allora compilatore allocare memoria.rodata per loro, sembra da assemblaggio, come segue:

 
    .file "hello.c" 
    .section .rodata 
.LC0: 
    .string "hello2" 
.LC1: 
    .string "hello"