Я пытаюсь написать функцию, которая принимает путь (char *) и разбивает его на массив строк, основанный на разделителе '/'. Упрощенный код ниже:
int split_path(char * path, char ** out) {
out = NULL;
char * token = strtok(path, "/");
int count = 0;
while(token) {
out = realloc(out, sizeof(char*) * (++count));
out[count-1] = malloc(sizeof(char) * strlen(token)+1);
strcpy(out[count-1], token);
fprintf(stderr, "%s\n", out[count-1]);
token = strtok(NULL, "/");
}
out = realloc(out, sizeof(char*) * (count+1));
out[count] = NULL;
return count;
}
int main(int argc, char * argv[]) {
char path[] = "/home/pirates/are/cool/yeah";
char ** out;
int count = split_path(path, out);
fprintf(stdout, "count: %d\n", count);
fprintf(stderr, "1st: %s\n", out[0]); // segfaults here
return 0;
}
Все операторы печати в функции split_path печатаются отлично, вывод выглядит следующим образом:
count: 1, string: home
count: 2, string: pirates
count: 3, string: are
count: 4, string: cool
count: 5, string: yeah
count: 5
1st: ./a.out
[1] 5676 segmentation fault (core dumped) ./a.out
Но по какой-то причине, когда я возвращаюсь к основной функции, массив двойных символов больше не действует. Я подумал, что это может быть потому, что он указывал на память, объявленную в этой функции split_path, но я делаю strcpy, чтобы получить в нее строки, поэтому он не должен указывать обратно на память, которая является локальной для этой функции. Любая помощь приветствуется.