2011-02-08 19 views
14

Kiedy uruchomić następujący kod:strcmp zachowanie

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    p = strcmp(NULL,"foo"); 

    return 0; 
} 

otrzymuję winy segmentacji. echo $? mówi 139. Ale kiedy uruchamiam

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int p = 0; 

    strcmp(NULL,"foo"); // Note removed assignment 

    return 0; 
} 

Nie otrzymuję żadnych błędów segmentacji. Czy ktoś mógłby rzucić trochę światła?

Oto moja gcc info:

> gcc --version 
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) 

Odpowiedz

30

Prawdopodobnie podczas kompilacji używasz opcji optymalizacji. Ponieważ wynik strcmp() w drugim fragmencie jest ignorowany, kompilator eliminuje to wywołanie funkcji, dlatego program nie ulega awarii. Wywołanie to można wyeliminować tylko dlatego, że strcmp() jest funkcją wewnętrzną, kompilator ma świadomość, że ta funkcja nie ma żadnych skutków ubocznych.

+0

Nie wprowadziłem żadnych ustawień kompilatora, aby włączyć optymalizację, ale robi to automatycznie. Byłeś na miejscu. –

+2

gcc ma SSA, która działa nawet bez włączonych optymalizacji. SSA może usunąć martwy kod. http://en.wikipedia.org/wiki/Static_single_assignment_form –

3

Co robisz jest niezdefiniowany. strcmp wymaga prawidłowych wskaźników do zakończonych znakiem NUL łańcuchów.

NULL nie jest wskaźnikiem łańcucha zakończonego znakiem NUL.

6

Musisz:

  • Dołącz odpowiednie nagłówki, albo zadeklarować funkcje ręcznie. Dla strcmp() potrzebujesz <string.h>.
  • Nie przekazuj nieprawidłowego wskaźnika, takiego jak NULL, do strcmp(), ponieważ nie chroni on przed nim i usunie wskaźnik, powodując niezdefiniowane zachowanie w programie.
+6

OP wie, że wartość NULL jest nieważna, ale zadaje pytanie, dlaczego te dwa przypadki są różne. –