Кошмары чистого разума
Ты не путаешь null pointer constant и null pointer value? Первое - это 0. А второе - это то говно, которое будет в указателе, когда в него этот 0 запишут. Соотвветственно NULL везде задефайнен в 0.
2) &x — не адрес, указатель работает, но как-то по-другому (читал о возможности такой хуйни в доках по MPI).Защищенный режим в процессоре Эльбрус. Указатель там особая сущность <> просто адресу.
1) NULL != 0 и зачемКогда-то я, вроде, слышал, что такое есть.
да, возможно, конечно ща погуглю.
Блин, в си и си++ по-разному
блин, я ж читал это тогда, что-то и забыл даже. Зато еще и тред перечитал
С одной стороны стандарт говорит об особом значении любого пойнтера, которое получается, когда 0 кастишь к его типу (вот правда не помню, любой ноль любого int типа, или только константный ноль). С другой стороны стандарт гарантирует фигню которую я называю representational transparency — для любого типа можно попросить sizeof (at compile time even! затем выделить массив из такого количества чаров и сделать memcpy, и посмотреть результат. Причём гарантируется, что одинаковые результаты соответствуют одинаковым значениям, но не обязательно наоборот из-за паддинга и прочего. И вот если так сделать, то может оказаться, что (void*)0 вовсе не состоит из нулевых байтов!
По поводу второго вопроса — хз что именно имеется в виду, у меня есть несколько предположений. Во-первых, полученное значение может оказаться как бы левым из-за мультипроцессорной магеи — адрес не в твоём адресном пространстве как бы. Во-вторых, может, если фигня, от которой берётся адрес, на самом деле какой-нибудь хитрый макрос, и адрес берётся от какого-нибудь temporary value?
И самое правдоподобное: ну вот например в нежно любимом мною 8051 микропроцессоре (восьмибитном) была туева хуча разных пойнтеров — восьмибитный поинтер в RAM, 16bit pointer to external RAM, and 16bit pointer to code memory. Плюс самый забавный из них — void*, собственно. Который был 24битный, селектор:адрес. Ну и вот может что-то в таком роде имеется в виду, что то, что ты получаешь, хоть и является в каком-то смысле адресом, но совершенно никак не похоже на все остальные адреса, которые ты используешь в обычном коде?
По поводу второго вопроса — хз что именно имеется в виду, у меня есть несколько предположений. Во-первых, полученное значение может оказаться как бы левым из-за мультипроцессорной магеи — адрес не в твоём адресном пространстве как бы. Во-вторых, может, если фигня, от которой берётся адрес, на самом деле какой-нибудь хитрый макрос, и адрес берётся от какого-нибудь temporary value?Блин, вот сейчас подумал, как сказать, почему это точно не о том, и вот, тут написано, что такое бывает на системах с сегментированным доступом к памати.
http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Ad...
Вроде теперь я почти все понял. Если у кого будет эсэсаш на систему с подобными закрутонами, с меня пиво
Оставить комментарий
Serab
Прошу для успокоения души и освобождения разума привести ссылки (или хотя бы рассказать) о системах/компиляторах/окружениях, где в языке C1) NULL != 0 и зачем
2) &x — не адрес, указатель работает, но как-то по-другому (читал о возможности такой хуйни в доках по MPI).