проверка правильности указателя в c ++ - PullRequest
2 голосов
/ 25 августа 2010

Я написал небольшой тест для проверки нулевого указателя, я упростил его с помощью int и 0, 1 вместо реальных классов, то, что я пытаюсь проверить, выглядит примерно так: который в реальном мире будет return p ? p->callmethod() : 0;

bool TestTrueFalse();
void main()
{
  int i = TestTrueFalse();

}

bool TestTrueFalse()
{  
    int one = 1;
    int * p =&one;    
    *p = 0;  

    return p ? 1 : 0;
}

Теперь вы можете видеть, что, как только указатель снова становится равным 0, тест не пройден, почему? что не так с этим? в чем решение?

Ответы [ 6 ]

4 голосов
/ 25 августа 2010
*p = 0;  

Вы, вероятно, имели в виду

p = 0;

* p = 0 устанавливает, на что указывает указатель, а не указатель

1 голос
/ 25 августа 2010

Код *p = 0; не устанавливает указатель на ноль. Он устанавливает, что р указывает на ноль.

1 голос
/ 25 августа 2010

Нулевой указатель - это указатель, который указывает на адрес 0, а не на значение 0.

Чтобы установить указатель на ноль, выполните:

p = 0;

Для уточнения своего кодаустанавливает указатель на int равным 0. Например:

int i = 1;
int *p = &i;
assert(*p == 1); //p points to 1

*p = 0;
assert(*p == 0 && i == 0); //p points to the same location, but that location now contains 0
1 голос
/ 25 августа 2010

При тестировании значения указателя с условным условием в C ++, он вернет true, если значение отличное от нуля, и false, если значение равно 0. В вашем примере p планируется указывать на локальный one и следовательно, имеет ненулевой адрес (даже если значение в адресе равно 0). Следовательно, вы получаете правду

0 голосов
/ 25 августа 2010

для проверки его на нулевой указатель перед проверкой указанного значения вы можете использовать код, подобный

if(ip != NULL)

взятый из http://www.eskimo.com/~scs/cclass/notes/sx10d.html

NULL может быть безопаснее в вашем коде, так как он более независим от компилятора, чем просто написание 0.и другим также может быть понятнее читать в вашем коде.

0 голосов
/ 25 августа 2010

Указатель - это адрес в памяти. int *p = &one; берет адрес переменной one и сохраняет его в p. *p = 0; хранит 0 в памяти, на которую указывает p, что означает, что значение one теперь равно 0. Итак, вы изменили то, на что указывает p, но не на p. TestTrueFalse() вернет 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...