Вам не нужно выделять память при использовании strtok()
Там нет никаких проблем в освобождении файла как правильно выделено таНос() , однако есть много других проблем и утечек памяти. В основном вы первый выделить память для str_ptr:
strk_ptr = malloc(sizeof(filename));
Здесь таНос() возвращает указатель, который хранится в strk_ptr. А потом вы звоните strtok() который также возвращает указатель внутри файла:
strk_ptr = strtok(filename,".");
Таким образом, вы потеряли первоначальный указатель, возвращаемый таНос() и теперь strk_ptr точки где-то в имя файла. Когда вы вызываете free(str_ptr)
, вы освобождаете память внутри filename. Последующий вызов free(filename)
сообщает об ошибке. Решение простое, что не нужно выделять память для strk_ptr.
Я написал рабочий минимальный код, чтобы показать вам, как правильно использовать strtok. Пожалуйста, помните, что, задавая вопрос, размещение минимального рабочего кода всегда лучше.
int main(int argc, char **argv) {
char *strk_ptr;
char *filename = malloc(strlen(argv[0]) + 1);
strcpy(filename, argv[0]);
printf("filename = %s, size = %zu\n", filename, sizeof(filename));
// Do not malloc this
//strk_ptr = malloc(strlen(filename) + 1);
strk_ptr = strtok(filename,".");//
printf("%s\n", strk_ptr);
while((strk_ptr = strtok(NULL,".")))
{
printf("%s\n", strk_ptr);
}
free(filename);
return 0;
}
Прежде всего ARGV это символ **, так что если вы хотите, чтобы скопировать содержимое первого аргумента, переданного в качестве входных данных вы должны использовать ARGV [0], который всегда исполняемый файл имя.
then, sizeof(filename)
возвращает размер указателя не тот контент, как filename не является массивом. вы должны использовать strlen(filename) + 1
.
strtok возвращает указатель внутри объекта (имя файла), которое уже выделено, так что вы не нужно выделить память для strk_ptr.
При использовании strtok в цикле рассмотрят принять следующий подход:
for (strk_ptr = strtok(filename, "."); strk_ptr; strk_ptr = strtok(NULL, "."))
{
printf("%s\n", strk_ptr);
}
они не просят об освобождении strtok памяти, они просят об освобождении их памяти после использования strtok. –
@KeithNicholas Спасибо, немного рассказать –