Проблема в том, что иногда вы устанавливаете temp_struct[i]->prod
в строку в кавычках ("Bar"), которую вы не можете освободить, а иногда в результат вызова substr, который вы должны освободить.
Самое простое решение - всегда указывать строку, которую вы должны освободить.
temp_struct[i]->prod = new_string("Bar");
где
char* new_string( const char* source )
{
char* dest = malloc( strlen(source) + 1 ) ;
strcpy(dest, source);
return dest ;
}
или, вы должны следить, если вам нужно освободить или нет
struct st_temp {
char *prod;
int prod_must_be_freed;
};
установите для prod_must_be_freed значение 0 или 1 и проверьте это перед освобождением.
И, наконец, все было бы улучшено за счет использования функций для манипулирования этими структурами, а не просто возиться с ними напрямую. Затем вы могли бы сделать free_st_temp(st_temp*)
, который проверял, должен ли prod быть освобожден, а затем освободил структуру. Ваш цикл будет
for(i = 0; i < 6; i++ ){
free_st_temp(temp_struct[i]);
}