LINUX.ORG.RU

Что значит array must be NULL-terminated ?


0

0

Прошу прощения за идиотский вопрос, но ответ на него не знаю. Если этот массив символьный, то в конце стоит '\0', а если это массив указателей, то это что значит - последний эл-т массива надо установить в NULL или как ?

anonymous
Ответ на: комментарий от lg

Последний элемент должен быть NULL.
NULL "официально" совместим с 0 только в ЦеПП.
И, потом, на 64бит. системах использование 0 потенциально опасно,
об этом даже в заметках Компака про 64бит компилер было написано.

Die-Hard ★★★★★
()

null-pointer по определнию это такой специальный pointer который не может указывать на что какой то объект или функцию (так например a = &obj; никогда не будет null-pointerом). я еще не видел ни одной ахитектуры в которой 0 - не я вляется null-pointerом, все же как сказал Die-Hard лучше писать NULL[если он определен конечно :)]

lg ★★
()

вот кстати в тему нашел:
According to the language definition, a constant 0 in a pointer context is converted into a null pointer at compile time. That is, in an initialization, assignment, or comparison when one side is a variable or expression of pointer type, the compiler can tell that a constant 0 on the other side requests a null pointer, and generate the correctly-typed null pointer value. Therefore, the following fragments are perfectly legal:

	char *p = 0;
	if(p != 0)

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

lg (*) (2002-08-28 16:23:29.577):
> я еще не видел ни одной ахитектуры в которой 0 - не я вляется null-pointerом
А я видел!
ДОС называется :O)

Die-Hard ★★★★★
()

что за архитектура такая ДОС?
и чему там равен NULL ?
вообще говря мне на самом деле кажеться что NULL это _всегда_ 0
(приведите пример когда это не так),
а задефайнин он чисто для читаемости или итпа того - хз вобщем зачем

lg ★★
()

книженцию когда-то читал -- Вопросы и ответы по Си и Си++ -- что-то в этом роде, по мотивам юзнетовских FAQ.

Там этот вопрос подробно затрагивался, но я конечно не помню что относилось к ЦеПП а что к Це. В ранних Си по моему не было гарантии что 0 будет конвертирован компилятором в нул-пойнтер, но сейчас гарантия есть.

Очень даже правдоподобно представить programing environment в котором (void *)0 это на самом деле какой нибудь 0xFFFFFFFF или 0x8000000. Так даже естественней.

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

lg (*) (2002-08-28 21:48:25.184):
> что за архитектура такая ДОС?
8-0?
> вообще говря мне на самом деле кажеться что NULL это _всегда_ 0
в любой современной 64 битной системе это не 0, а 0l ;).

> (приведите пример когда это не так),
Я ж уже привел - в Досе это было не так! Там были сегментированные указатели,
состоящие из двух 16-битных целых. А длинное целое было 32-битным.

> а задефайнин он чисто для читаемости или итпа того - хз вобщем зачем
А если цитатку продолжить ;)?
Summary:

Unadorned 0 okay:

initialization
assignment
comparison
function call, prototype in scope, fixed argument

Explicit cast required:

function call, no prototype in scope
variable argument in varargs function call

BTW, злые языки утверждают, что NULL был отвергнут ЦеППшниками по одной
единственной причине - они очень не любят #define'ы

Вообще, IMHO на ЦеПП надо пользовать 0, а на Сях - NULL.

Die-Hard ★★★★★
()

> Я ж уже привел - в Досе это было не так! Там были сегментированные указатели, > состоящие из двух 16-битных целых. А длинное целое было 32-битным.

то есть написав: void *a = 0; if (a) printf("ok\n");

и скомпилив это дело в каком нибудь watcom например я мог получить "ok"?

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


lg (*) (2002-08-29 10:35:17.98)
>...написав: void *a = 0; if (a) printf("ok\n");
Заинтриговал!
Попробую дома вечером на компутере жены- - вроде, Борланд 3.1 там где-то завалялся...

Вообще, в ЦеПП 0, вроде, должен привестись при компиляции.

Вот что, скорее всего, не пройдет:
void *a; int i=0; a=i;

Die-Hard ★★★★★
()

первое обязано пройти везде, иначе компилятор не удовлетворяет последним стандартам и си и си++. Второе не пройдет потому что это ошибка компиляции.

а вот a = (void *)i зависит от платформы.

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

2lg (*) (2002-08-29 10:35:17.98):
> void *a = 0; if (a) printf("ok\n");
У, проканало! Удивлен...

Борланд (3.1, кажется) при присваивании указателям целых работает с
указателями как с unsigned лонгами (в больших моделях) или как с unsigned
int (в маленьких моделях), т.е. гонит стандартные знаковые расширения. Типа
void *a=-1 получается ffffffff:ffffffff (large модель). Ругается, правда,
warning'ами, nonportable pointer conversion, если справа что-либо кроме 0.

Удивлен, ибо помню такие глюки в large модели:

char *a=malloc(17);
char *b=a-2;

В результате b указывает в никуда...

Насколько я знаю, совместимость поинтера с нулем по присваиванию появилась
в довольно поздних версиях АНСИ, и по этому поводу был бурный дискашен.

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

поправка: в предыд. постинге в примере ff'ов в 2 раза меньше:)
ffff:ffff

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