В чём разница между следующими парами длин и указателей?
size_t len1 = 0;
char *ptr1 = NULL;
size_t len2 = 0;
char *ptr2 = malloc(0);
size_t len3 = 0;
char *ptr3 = (char *)malloc(4096) + 4096;
size_t len4 = 0;
char ptr4[0];
size_t len5 = 0;
char ptr5[];
Во многих случаях все пять выражений приведут к одному результату. В других – их поведение может кардинально отличаться. Одно из очевидных различий состоит в возможности передать указатель для его освобождения, но его мы рассматривать не будем. Первый случай интересный, но слишком сильно отличается от других, поэтому его пока отложим.
#### malloc(0)
Поведение malloc(0) определено стандартами. Можно вернуть нулевой или уникальный указатель. Второй вариант во многих реализациях выполняется внутренним увеличением длины на единицу (которая затем обычно округляется до 16). По правилам, разыменовать такой указатель нельзя, но обычно несколько байт всё-таки размещаются, и поэтому такая программа не упадёт. Возврат NULL приводит к возможности возникновения интересного бага. Часто возврат NULL из malloc расценивается как ошибка. [Читать дальше →][1]
[1]:
http://habrahabr.ru/post/268989/#habracut