2012-05-17 2 views
1

В чем причина этого? Я думал, что если указатель равен нулю, остальное условие не будет оцениваться.Почему это обусловлено причиной сбоя seg?

// doesn't work: 
char *ptr = somefunction(); 

if (ptr && ptr[0] == '1' || ptr[0] == 't') 
    // ... 



// does work: 
char *ptr = somefunction(); 
if (ptr) 
    if (ptr[0] == '1' || ptr[0] == 't') 
     // ... 
+0

Не ваша проблема здесь, но обратите внимание, что только потому, что указатель не равен null, это не значит, что он действителен ... –

ответ

5
ptr && ptr[0] == '1' || ptr[0] == 't' 

означает:

  • если ptr && ptr[0] == '1' (ложь, потому что ptr является недействительным и ptr[0] == '1' не получить оценку)
  • или ptr[0] == 't' (бум)

Использование :

ptr && (ptr[0] == '1' || ptr[0] == 't') 

вместо этого.

1

Ваш отзыв будет неправильно. Это будет работать:

if (ptr && (ptr[0] == '1' || ptr[0] == 't')) 

В принципе, в любое время у вас есть и && и || в вашем коде, вам нужно скобки там, чтобы убедиться, что он делает то, что вы имеете в виду это.

3

&& имеет higher precedence, чем || поэтому код эквивалентен:

if ((ptr && ptr[0] == '1') || ptr[0] == 't') 

и если первый (...&&..) выходит из строя, то вторая половина || оценивается.

1

У вас есть Null ptr & & разблокирован Null ptr, который вызывает отказ seg.

C дает вам возможность иметь такие утверждения, как if (ptr == NULL) что-то делать; Если он всегда оценивал условие на false, когда был обнаружен нулевой указатель, такие утверждения не будут работать.

Смежные вопросы