char* str = malloc(sizeof (strlen(tribe_name) + 1));
sizeof (strlen(tribe_name) + 1)
, по-видимому, оценивается в sizeof(size_t)
в вашем случае, потому что sizeof
возвращает размер в байтах представления объекта типа выражения, а sizeof(size_t)
в современных 64-битных системах с 8 байт больше sizeof(int)
с 4 байтами.
Поскольку тип возвращаемого значения strlen
имеет тип size_t
, а 1
- int
, и по правилу большинства значение int
будет преобразовано в size_t
(больший тип) перед вычислением выражения, если sizeof(size_t)
больше sizeof(int)
, результат (strlen(tribe_name) + 1)
будет иметь тип size_t
.
Таким образом, память размером size_t
объекта с 8 при этом вызове для байта выделяется malloc()
.
В 8 байтах вы можете хранить только строку из 7 символов плюс требуемый завершающий строку нулевой символ.
Если вы пытаетесь сохранить Строка из более чем 7 символов в этой памяти, вы будете писать за пределами выделенной памяти, что неправильно.
Вместо этого должно быть
char* str = malloc(sizeof(char) * (strlen(tribe_name) + 1));