Ваша непосредственная проблема - вы пытаетесь использовать VLA ( Array Variable Length Array ), введенный в стандарт с C99, с компилятором, который не поддерживает VLA. Без поддержки VLA массивы должны быть объявлены с целочисленной константой (а не просто const int
). Начиная с C11, поддержка VLA является необязательной.
Чтобы решить вашу непосредственную проблему и обеспечить мобильность, просто выделите хранилище для paths
вместо malloc
. free
памяти перед возвратом из вашей функции (либо при возврате ошибки, либо при успешном завершении)
Вы можете сделать что-то вроде:
size_t pathlen = strlen(src) + 1 + strlen(name) + 2 + 1;
char *paths = malloc (pathlen); /* allocate storage for paths */
if (!paths) { /* validate EVERY allocation */
perror ("malloc-paths");
return 3; /* or however you want to handle the error */
}
char *suff = stpcpy(path, src);
...
*head = fopen(path, "wx");
if (*head == NULL) {
free (path); /* free paths */
return errno == EEXIST ? 2 : 1;
}
...
if (*code == NULL) {
int err = errno;
free (path); /* free paths */
fclose(*head);
*head = NULL;
*suff = 'h';
unlink(path);
return err == EEXIST ? 2 : 1;
}
free (path); /* free paths */
return 0;
Для этого есть небольшие издержки распределение и бесплатное, но оно незначительно в вашем случае, когда есть одно выделение и одно бесплатное.