LINUX.ORG.RU

[C] Константный указатель

 


0

0

Мне нужен указатель, который указывает на гарантированно неиспользуемый участок памяти. Например такой как NULL.

Я сделал так:

#define SOMECONST ((void *)((int)NULL + 1))

Это нормально/безопасно? Есть лучше варианты?

не. может тогда использовать адресс глобальной переменной? что-то типа:

char dfndjs;

#define SOMECONST ((void *)dfndjs)

anonymous
()
Ответ на: комментарий от ratatosk

> В каком смысле «безопасно»

В том, что не начнёт ли подобный указатель на каких-нибудь платформах указывать на мою переменную.

Ruga-Suneto
() автор топика
Ответ на: комментарий от Ruga-Suneto

как выше сказали:

#define SOMECONST ((void *)&djbdns)

либо

#define SOMECONST ((void *)«djbdns»)

если твои объекты не являются строковыми литералами.

dilmah ★★★★★
()
Ответ на: комментарий от Ruga-Suneto

>В том, что не начнёт ли подобный указатель на каких-нибудь платформах указывать на мою переменную.

NULL для того в С и существует, что бы решать эту задачу. Почему его не хватает?

anonymous
()
Ответ на: комментарий от Ruga-Suneto

Нет, только если компилятор их в одну упакует. Но не гарантировано.

ratatosk
()
Ответ на: комментарий от ratatosk

Наверное, для обработки ошибок. Хотя, обычно для этого передают указатель на переменную(либо сразу несколько указателей на переменные), куда функция пишет данные, а сама возврашает либо 0, либо код ошибки.

anonymous
()

Вроде, когда не хватает NULL, используют -1, например результат функции mmap():

#define MAP_FAILED ((void *) -1)

аналогично PTHREAD_CANCELED. Но я стандартнов не читал, не могу сказать, что это гарантированно на любом компиляторе на любой архитектуре.

mky ★★★★★
()
Ответ на: комментарий от mky

C99

6.3.2.3.3

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

55)The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant;

Таким образом по адресу -1 в принципе может что-то оказаться.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.