2016-04-13 10 views
12

wiem, że przy porównywaniu wskaźnik char z jakąś wartość char trzeba poprzedzić wskaźnik z *, ale znalazłem w jakimś kodem porównanie jak:Porównując wskaźnik z char koniec sznurka

char* c; 
// ... 
while (*c != ']' && *c != '\0') // search for some character 
{ 
    c++; 
} 
if (c == '\0') 
{ 
    return -1; // error 
} 

So moje pytanie brzmi: czy to błąd, czy specjalny przypadek? Czy nie powinien tam być if (*c == '\0')?

+5

zły sposób sprawdzania NULL. –

+2

Tak, dereferencje w tym przypadku wydają się logiczną rzeczą, więc najprawdopodobniej jest to błąd. –

+14

To błąd. To skutecznie sprawdza 'c' dla NULL, co powinno być zrobione w' // ... 'w pierwszej kolejności. Autor prawdopodobnie miał na myśli 'if (* c == '\ 0')', aby sprawdzić, czy pętla wylądowała na terminatorze w stosunku do '']''. – WhozCraig

Odpowiedz

9

zerowa Wskaźniki

stałej całkowitej dosłownym 0 ma inne znaczenie w zależności od kontekstu, w którym jest on używany. We wszystkich przypadkach jest to stała liczbowa o wartości 0, opisana jest tylko na różne sposoby.

Jeśli wskaźnik jest porównywany ze stałym literałem 0, to sprawdza, czy wskaźnik jest wskaźnikiem pustym. To 0 jest następnie określane jako stała wskaźnika zerowego. Standard C definiuje, że 0 rzutowanie na typ void * jest zarówno wskaźnikiem zerowym, jak i stałą wskaźnika pustego.

Dodatkowo, aby ułatwić czytelność, w pliku nagłówkowym stddef.h podano makro NULL.

Dlatego oto kilka ważnych sposobów, aby sprawdzić, null pointer:

if (pointer == NULL)

NULL definiuje porównać równa null pointer. Jest to implementacja zdefiniowana, jaka jest rzeczywista definicja wartości NULL, o ile jest to poprawna zerowa stała wskaźnika.

if (pointer == 0)

0 jest inna reprezentacja zerowej stałym wskaźnikiem.

Null Postacie

'\0' definiuje się znak null - że to postać z wszystkimi bitami ustawionymi na zero. To nie ma nic wspólnego ze wskaźnikami. Jednakże można zobaczyć coś podobnego do tego kodu:

if (!*string_pointer)

kontroli jeśli wskaźnik ciąg jest wskazując na znak null

if (*string_pointer)

kontrole, jeśli wskaźnik ciąg jest wskazujące na nie- pusty znak.

Moje pytanie brzmi: czy to błąd, czy specjalny przypadek? Czy nie powinno tam być (* c == '\ 0')?

Instrukcja w kodzie if (c == '\0') sprawdza, czy wskaźnik jest równy 0. Oznacza to, że sprawdza, czy c jest wskaźnikiem zerowym. Ale myślę, że to błąd, ponieważ instrukcja, aby sprawdzić, czy c jest wskaźnikiem NULL jest po uzyskaniu dostępu do wartości przechowywanej w c. Myślę, że program ma zamiar zlokalizować postać ]. Jeśli znajdzie znak ] przed znakiem pustym, to nie zwróci -1. Więc skorygowana deklaracja powinna być-

if (*c == '\0') 
{ 
    return -1; // It didn't found the '[' character! 
} 
15

Masz rację.

c == '\0' 

sprawdza, czy sam wskaźnik jest równy 0, a nie znak, na który wskazuje wskaźnik.