В вашем примере полезность не является ни особенно очевидной, ни убедительной, и вопрос и код ошибочны - что, если тип изменится?datalen = N
будет неадекватного размера.Есть лучшая идиома, которая лучше использует sizeof;sizeof (char) не имеет смысла, потому что по определению он равен 1 (хотя CHAR_BIT не обязательно должен быть 8)
Если тип данных динамического массива должен был измениться, и вы разместили в блоках sizeof (объект), а неsizeof (type), тогда ваш код станет более легко обслуживаемым.
например,
char* data = malloc(sizeof(*data) * N ) ;
, тогда, если позже вы решите, что данные должны быть int, например:
int* data = malloc(sizeof(*data) * N ) ;
только одно изменение вместо двух (или еще больше каждый раз, когда необходим размер).Это особенно полезно для структур и пользовательских типов:
tSomeType* data = malloc(sizeof(*data) * N ) ;
, где вы можете изменять размер типа, добавляя или удаляя элементы, например.