Кошмары чистого разума

Serab

Прошу для успокоения души и освобождения разума привести ссылки (или хотя бы рассказать) о системах/компиляторах/окружениях, где в языке C
1) NULL != 0 и зачем
2) &x — не адрес, указатель работает, но как-то по-другому (читал о возможности такой хуйни в доках по MPI).

okunek

Ты не путаешь null pointer constant и null pointer value? Первое - это 0. А второе - это то говно, которое будет в указателе, когда в него этот 0 запишут. Соотвветственно NULL везде задефайнен в 0.

Papazyan

2) &x — не адрес, указатель работает, но как-то по-другому (читал о возможности такой хуйни в доках по MPI).
Защищенный режим в процессоре Эльбрус. Указатель там особая сущность <> просто адресу.

apl13

1) NULL != 0 и зачем
Когда-то я, вроде, слышал, что такое есть.

Serab

да, возможно, конечно :) ща погуглю.

salamander

1) NULL != 0 и зачем
http://c-faq.com/null/machexamp.html
Из треда.

okunek

Блин, в си и си++ по-разному :(

Serab

блин, я ж читал это тогда, что-то и забыл даже. Зато еще и тред перечитал :)

bleyman

кстати абсолютно прав, пусть стыдно будет тому, кто поставил ему минусик!11
С одной стороны стандарт говорит об особом значении любого пойнтера, которое получается, когда 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битный, селектор:адрес. Ну и вот может что-то в таком роде имеется в виду, что то, что ты получаешь, хоть и является в каком-то смысле адресом, но совершенно никак не похоже на все остальные адреса, которые ты используешь в обычном коде?

Serab

По поводу второго вопроса — хз что именно имеется в виду, у меня есть несколько предположений. Во-первых, полученное значение может оказаться как бы левым из-за мультипроцессорной магеи — адрес не в твоём адресном пространстве как бы. Во-вторых, может, если фигня, от которой берётся адрес, на самом деле какой-нибудь хитрый макрос, и адрес берётся от какого-нибудь temporary value?
Блин, вот сейчас подумал, как сказать, почему это точно не о том, и вот, тут написано, что такое бывает на системах с сегментированным доступом к памати.
http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Ad...
Вроде теперь я почти все понял. Если у кого будет эсэсаш на систему с подобными закрутонами, с меня пиво :)
Оставить комментарий
Имя или ник:
Комментарий: