Попытка вернуть два указателя на двумерный массив в C - PullRequest
0 голосов
/ 21 октября 2018

Я очень плохо знаком с C и с трудом возвратил указатель на двумерный массив.

Цель кода - перейти в папку с именем rules.Из этой папки он находит все пути к файлам для всех файлов в папке правил.Я хочу заполнить двухмерный массив полными путями к файлам.На данный момент мой код способен заполнять двухмерный массив с помощью filepaths (это делается в методе listFiles).Я хотел бы использовать этот двумерный массив в методе main, чтобы сделать кое-что еще.Но у меня возникают проблемы при попытке вернуть его без проблем с компиляцией.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif
#include <string.h>

void listFiles(char *path);

int main() {
  // Directory path to list files
  char path[100];
  char buff[FILENAME_MAX];
  GetCurrentDir(buff, FILENAME_MAX);
  // printf("%s\n",buff);
  char toRuleFolder[100] = "/rules";
  strcat(buff, toRuleFolder);
  // printf("%s\n",buff);

  listFiles(buff);

  return 0;
}

void listFiles(char *path) {
  char pathToUse[100];
  struct dirent *dp;

  char *arrayOfArraysOfChars[30][50]; // array to hold     multiple single
                                      // arrays of characters
  DIR *dir = opendir(path);
  printf(" %s\n", path);

  return;

  char *token;
  const char s[2] = "-";
  int counter = 0;
  char pathToSave[100];

  while ((dp = readdir(dir)) != NULL) {

    token = strtok(dp->d_name, "");

    while (token != NULL) {

      if (strcmp(token, ".") != 0) {
        if (strcmp(token, "..") != 0) {

          strcpy(pathToSave, "");
          strcpy(pathToSave, path);
          strcat(pathToSave, "/");
          strcat(pathToSave, token);

          strcpy(arrayOfArraysOfChars[counter], pathToSave);

          counter += 1;
        }
      }

      token = strtok(NULL, s);
    }
  }

  printf("%s\n", "sdasdasdssad");
  printf("%s\n", arrayOfArraysOfChars[0]);
  printf("%s\n", arrayOfArraysOfChars[1]);
  printf("%s\n", arrayOfArraysOfChars[2]);
  printf("%s\n", arrayOfArraysOfChars[3]);

  closedir(dir);
}

arrayOfArraysOfChars заполняется необходимой мне информацией.Но я хотел бы иметь возможность получить доступ к этому массиву из основной функции.Как бы я это сделал?

1 Ответ

0 голосов
/ 21 октября 2018

Я предполагаю, что ваш компилятор предупреждает вас о возвращении локальных переменных.

char *arrayOfArraysOfChars[30][50]

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

a) Передать его как параметр

b) Сделать статичным (юк)

c) Динамически выделить его и вернуть указатель

Кроме того, рассмотрите возможность использования связанного списка выделенных строк, а не массива, так как, я думаю, вы не знаете наверняка, сколько файлов вы собираетесь найти или как долго их имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...