Я немного уточню комментарий Абеленки. Ожидаете ли вы, что эти два typedefs будут эквивалентны типам продуктов?
typedef char *string;
typedef char string[100];
Как насчет этих двух?
typedef struct { char *s; ... } header_t;
typedef struct { char s[100]; ... } header_t;
Ваш ответ явно нет в обоих случаях. Да, вы можете скомпилировать des=a
, потому что a
дает указатель, но a
на самом деле является массивом.
В частности, вы также знаете, что этот последний typedef не резервирует память для указателя. В результате a
имеет примерно тип char * const
, означающий, что a
является постоянным указателем на непостоянные символы, и, таким образом, a=des
выдает ошибку типа. Я не знаю, будет ли упомянутое сообщение об ошибке содержать массив const
или lvalue.