Я использовал malloc (0) для указателя на char, и мой код работает. Это почему?

Я создал массив указателей на char . Я использовал malloc(0) для выделения памяти для этих указателей.

После этого я использовал scanf() чтобы ввести ровно одно слово в байты, выделенные malloc(0 и это сработало.

Это почему?

Прежде всего, с man-страницы для malloc() , ( акцент мой )

Если размер равен 0, то malloc() возвращает либо NULL , либо уникальное значение указателя, которое впоследствии может быть успешно передано в free() .

Таким образом, не гарантируется, что malloc(0) вернет NULL, всегда. Таким образом, ваш NULL-чек не может быть успешным.

Затем, чтобы ответить

Это почему?

потому что, если malloc(0) возвращает указатель другой han NULL, он подходит только для использования в качестве аргумента для более позднего вызова free() , ничего другого. В вашем случае вы пытаетесь записать в память. Это по существу попытка записать в недопустимую память , память, которая не выделена для вашей программы. Это вызывает неопределенное поведение .

Реальная красота UB заключается в том, что иногда программа, вызывающая UB, работает очень хорошо .