информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Простое пробивание рабочего/провайдерского... 
 400 уязвимостей в процессорах Snapdragon 
 Яндекс неуклюже оправдался за установку... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Thank you! 03.03.05 17:28  Число просмотров: 1800
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
> > Верно ты сказал, что NULL определён как ((void *)0)
> (хотя
> > не всегда).
>
> Да, действительно, NULL может и не иметь бинарное
> представление нули-во-всех-битах, тем не менее
> гарантируется, что с ним можно производить оперции
> сравнения/присвоения и все будет работать.
>
> > Не помню где ... , но мелькало замечание ГУРей, что
> дескать
> > нет гарантии, что при использовании "некоторого"
> компилера
> > (знать бы мне, что за компиллер;)))) код с вызовом
> > некоторой функции, возвращающий, например, char * :
>
> Сомневаюсь в их правоте. NULL гарантированно приводится к
> любому типу и наоборот. И при этом остается NULL-ом.
>
> > ПС. Прошу прощения за тупые вопросы. Тем более, что на
> > практике всё работает, как ты говоришь.
>
> Не могу сразу придумать для C код, иллюстрирующий то, что
> при любых махинациях NULL остается NULL-ом, но вот код на
> C++
>
>
> struct Base1 {
> 	long	data;
> };
> 
> struct Base2 {
> 	long	data;
> };
> 
> struct Derived: public Base1, public Base2 {
> };
> 
> void
> main() {
> 	Derived *pd = NULL;
> 	Base1	*pb1 = pd;
> 	Base2 *pd2 = pd;
> 	if (pb1 != NULL|pb2 != NULL) {
> //  Отформатировать винчестер
> 	}
> };
> 

---
>
> Указатели на разные базовые классы в итоге равны друг другу
> и указателю на класс-наследник. А все потому, что в коде
> приведения типов стоит проверка на NULL и указатель
> смещается только если указатель не NULL. Это все к вопросу
> о гарантии того, что NULL остается NULL-ом при любых
> приведениях типов: то есть гарантируется что сравнение
> такого указателя с NULL-ом будет возвращать истину (а как
> это реализовано - неважно). И именно поэтому стандарт не
> рекомендует сравнивать с нулем (потому что NULL может
> таковым и не быть).

Thank you!

Does it mean that the following code will be incorrect?

if ( !some_function() )
{

}

saying that

if ( some_function() == 0 )
{

}

instead of

// correct
if ( some_function() == NULL )
{

}

PS.
Sorry. I don’t have “Russian” keyboard at the moment; but I don’t want this question to be postponed.
<programming> Поиск 








Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach