Есть ли способ взять содержимое массива и сохранить его в указателе? - PullRequest
0 голосов
/ 30 октября 2019

Я пишу программу, которая выдает результаты, аналогичные команде ls -l. В настоящее время я могу получать результаты с помощью циклов, но теперь я хочу сохранить определенные переменные в связанном списке, чтобы позже я мог поместить его через лексико-графический сортировщик. Я могу правильно хранить большую часть переменной в узле, но проблемы возникают из-за того, что я пытаюсь сохранить переменную разрешения. Есть ли способ, которым я могу получить содержимое char [] на char *?

При настройке этого параметра разрешения сохраняются в char [], но я не нашелиспользовать char [] в качестве возвращаемого типа, поэтому я решил, что char * будет более подходящим, но сейчас я пытаюсь выяснить, как перейти от char [] к char *.

char* find_perms(mode_t st) {
    char* perms_ptr;
    char perms[11];
    if(st && S_ISREG(st)) perms[0]='-';
    else if(st && S_ISDIR(st)) perms[0]='d';
    else if(st && S_ISFIFO(st)) perms[0]='|';
    else if(st && S_ISSOCK(st)) perms[0]='s';
    else if(st && S_ISCHR(st)) perms[0]='c';
    else if(st && S_ISBLK(st)) perms[0]='b';
    else perms[0]='l';  // S_ISLNK
    perms[1] = (st && S_IRUSR) ? 'r':'-';
    perms[2] = (st && S_IWUSR) ? 'w':'-';
    perms[3] = (st && S_IXUSR) ? 'x':'-';
    perms[4] = (st && S_IRGRP) ? 'r':'-';
    perms[5] = (st && S_IWGRP) ? 'w':'-';
    perms[6] = (st && S_IXGRP) ? 'x':'-';
    perms[7] = (st && S_IROTH) ? 'r':'-';
    perms[8] = (st && S_IWOTH) ? 'w':'-';
    perms[9] = (st && S_IXOTH) ? 'x':'-';
    perms[10] = '\0';
    printf("%s ",perms);
    perms_ptr = perms;
    return perms_ptr;
}

как сейчас, он возвращает char *, но вместо указания массива, который я надеялся использовать позже, он указывает на пустую строку. Когда я использовал gdb, чтобы посмотреть, на что указывает perms_ptr, он просто показывался как "".

1 Ответ

1 голос
/ 30 октября 2019

Символ char [] доступен точно так же, как символ *. Его можно легко вернуть, но его нужно динамически размещать внутри функции или иным образом передавать в качестве параметра функции.

Возвращение локальной переменной является ошибкой, которая приводит к неопределенному поведению, поскольку она хранится встек и будет перезаписан, как только функция вернется.

В вашей функции возврат perms в порядке (нет необходимости определять другой указатель), если вы выделите его с помощью perms = malloc (11);

(Вам придется освободить его за пределами вашей функции).

...