Что-то код какой-то странный и путаный %) Я не спец в Сях, но мне кажется странным, что в ф-ции red_add() выделяется всего 1 байт. Для структуры это явно мало. IMHO было бы правильнее написать h = malloc(sizeof(struct Red));
Вообще да, но код автора будет работать, правда то, что он вылезит не туда куда можно, это факт...
Нормальная ос, сегфольнит это сразу, не нормальная, позволит работать... (/me вспомнил, как развлекался в native-dos'е с лазеньем по памяти... принтер печатал мусор... Лепота была в общем... эх...)
А подумать головой, и попробовать придумать, каким образом malloc мог бы узнать размер того, чему присвоят его возврат, не? Ну это не говоря уже о доку почитать...
Кстати, еще два пункта:
- не надо кастить возврат маллока (от void* имплицитный каст в другие типы указателей правильно работает, а если ругается на conversion from int to pointer - значит, кто-то не подключил unistd.h).
- для выделения структур, вероятно, правильнее использовать calloc.