char* filename = (char *)malloc(strlen(version) + strlen(argv[3]));
Во-первых, вам не нужно приводить возвращаемое значение из malloc(3)
.Если вы добавите #include <stdlib.h>
в свою программу, вы получите прототип malloc(3)
, который сообщает компилятору, как правильно обрабатывать возвращаемое значение из malloc(3)
.Самостоятельная проверка может помочь в написании полезных предупреждений или ошибок, которые могут выявить ошибки.Добавьте #include
и удалите приведение.
Кроме того, это, кажется, не выделяет достаточно памяти для вашего имени файла;не забывайте, что strlen(3)
не не включает пробел для завершающего байта ASCII NUL
в конце строки, но вашему filename
определенно понадобится этот завершающий NUL
.
Всякий раз, когда вы видите такой код:
bar = malloc(strlen(foo));
, это почти всегда ошибка.Вместо этого он должен выглядеть следующим образом:
bar = malloc(strlen(foo)+1);
Даже если вычисление размера нарушено в другом месте, я часто хотел бы поместить +1
в вызов malloc()
специально, просто чтобы убедиться, что я его знаюесть в будущем.
Когда ваш file0
равен NULL
, вам, вероятно, также следует позвонить perror(3)
, чтобы сообщить , почему вы не смогли открыть файл.Это может быть «отказано в разрешении».Возможно, текущий рабочий каталог больше не существует.(Это не позволит вам создавать файлы в каталоге, даже если разрешения вашей файловой системы в противном случае позволят вам создавать файлы.)