Возвращает многомерный массив символов в C

#c #arrays #multidimensional-array

#c #массивы #многомерный массив

Вопрос:

Как я могу создать функцию на C, которая возвращает массив строк? Или многомерный массив символов?

Например, я хочу вернуть массив char paths[20][20] , созданный в функции.

Моя последняя попытка

 char **GetEnv()
{
  int fd;
  char buf[1];
  char *paths[30];
  fd = open("filename" , O_RDONLY);

  int n=0;
  int c=0;
  int f=0;
  char tmp[64];

  while((ret = read(fd,buf,1))>0)
  {
    if(f==1)
    {
      while(buf[0]!=':')
      {
        tmp[c]=buf[0];
        c  ;
      }
      strcpy(paths[n],tmp);
      n  ;
      c=0;
    }
    if(buf[0] == '=')
      f=1;
  }
  close(fd);

  return **paths; //warning: return makes pointer from integer without a cast
  //return (char**)paths; warning: function returns address of local variable

}
  

Я пробовал различные «настройки», но каждый выдает какую-то ошибку.

Я не знаю, как работает C

Комментарии:

1. Пожалуйста, покажите код, который создает массив. Предполагая, что массив набран так, как char** вы должны return array , но вам это нужно malloc , а не объявлять его в стеке. Помните, что переменные стека действительны только в течение срока службы фрейма стека, в котором они были объявлены.

2. Вы возвращаете указатель на выделенную стеком память. Вы не можете этого сделать ‘ Компилятор говорит вам не делать этого. Разместите его в куче.

3. Я знаю разницу, я заставил код работать. Но теперь у меня появилась еще одна странная проблема. После возврата массива и успешного обхода и использования его вызов функции (который работал ранее) вызывает ловушку.

4. Похоже, вы не заставили его работать, если у вас есть ловушка. Давайте внесем ясность, вы изменили объявление путей на char ** и использовали malloc, как указано в ответах, объявление путей в char ** и использовали malloc, как указано в ответах

5. Я обновил ответ, пожалуйста, посмотрите код.

Ответ №1:

Вы не можете безопасно вернуть массив, выделенный стеком (используя синтаксис array[20][20] ).

Вы должны создать динамический массив с помощью malloc:

 char **array = malloc(20 * sizeof(char *));
int i;
for(i=0; i != 20;   i) {
    array[i] = malloc(20 * sizeof(char));
}
  

Тогда возврат массива работает

Комментарии:

1. Каким будет синтаксис для возврата в этом случае? То же, что и я?

2. Вам нужно вернуть что-то типа char** . В вашем коде paths есть этот тип.

3. Значит, мне просто нужно return paths ?

4. @LifeH2O Нет, вам нужно сделать это так, как я изложил. ваш paths стек все еще распределен.

5. @life знаете ли вы разницу между стеком и кучей. Пока вы этого не сделаете, вам нужно stop.@life знаете ли вы разницу между стеком и кучей? Пока вы этого не сделаете, вам нужно остановиться.

Ответ №2:

Вы должны просто return array ( return array; ) . ** объявление after используется для разыменования.

Кроме того, убедитесь, что память для этого массива выделена в куче (с использованием malloc аналогичной функции or)

Комментарии:

1. @Foo Bah сказано в исходном вопросе return **array .

2. его строка была return **array; , которая вызывает разыменование.