Программирование на C: malloc() внутри функции

#c #arrays #function #pointers #malloc

#c #массивы #функция #указатели #malloc

Вопрос:

Я хотел бы выделить память в функции, а затем использовать это пространство в main ().
В функции все в порядке, но я никогда не могу получить доступ к данным в main ().
Существуют две инструкции по выделению памяти для моделирования двумерного массива символов

Вот мой код:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>

int getNetworks(char **networks) {

  networks = malloc(5 * sizeof(char*));
  printf("networks in function:%pn", networks);

  networks[0] = (char*) malloc(4);
  strcpy(networks[0], "aaa");
  networks[1] = (char*) malloc(3);
  strcpy(networks[1], "bb");
  networks[2] = (char*) malloc(5);
  strcpy(networks[2], "cccc");
  networks[3] = (char*) malloc(6);
  strcpy(networks[3], "ddddd");
  networks[4] = (char*) malloc(2);
  strcpy(networks[4], "e");
  return 5;
}

int main ()
{
  char **networks = NULL;
  int nbNetworks;

  printf("networks before call:%pn", networks);
  nbNetworks = getNetworks(amp;*networks);
  printf("networks after call:%pn", networks);
  for (int i=0; i<=nbNetworks-1; i  ) {
    printf ("%sn", networks[i]);
  }
  return 0;
}
  

Вывод является

 networks before call:0x0
networks in function:0x7feb65c02af0
networks after call:0x0
Segmentation fault: 11
  

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

1. Это должно быть *networks = malloc(5 * sizeof(char*)); потому что вы хотите изменить родительскую переменную, а не параметр value в стеке.

2. getNetworks(amp;*networks); плохо пахнет.

3. Точно так же это должно быть (*networks)[0] = (char*) malloc(4); , как вы работаете с родительским массивом.

Ответ №1:

Необходимо исправить следующее:

 int getNetworks(char ***networks)
  

поскольку это указатель на массив указателей на символы. (Вы также можете записать это как
char **networks[] ).

В функции вы должны сначала разыменовать указатель, чтобы работать с родительской переменной:

     *networks = malloc(5 * sizeof(char*));
    (*networks)[0] = (char*) malloc(4);
  

В основном ваше объявление правильное, однако вы должны вызывать как:

     getNetworks(amp;networks);
  

таким образом, функция может работать с родительской переменной.

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

1. Это сработало сразу, спасибо!

Ответ №2:

В вашем коде много проблем, я не буду их комментировать, но предложу вам это решение:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>

char** getNetworks(int *n)
{
  int count = 5;
  char ** networks = malloc(count * sizeof(char*));
  printf("networks in function:%pn", networks);

  networks[0] = (char*) malloc(4);
  strcpy(networks[0], "aaa");
  networks[1] = (char*) malloc(3);
  strcpy(networks[1], "bb");
  networks[2] = (char*) malloc(5);
  strcpy(networks[2], "cccc");
  networks[3] = (char*) malloc(6);
  strcpy(networks[3], "ddddd");
  networks[4] = (char*) malloc(2);
  strcpy(networks[4], "e");
  *n = count;
  return networks;
}

int main ()
{
  char **networks = NULL;
  int nbNetworks;

  printf("networks before call:%pn", networks);
  networks = getNetworks(amp;nbNetworks);
  printf("networks after call:%pn", networks);
  for (int i=0; i < nbNetworks; i  ) {
    printf ("%sn", networks[i]);
  }
  return 0;
}
  

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

1. предупреждение : malloc(*n * sizeof(char*)) пока *n (фактически nbNetworks ) не инициализирован, переместитесь *n = 5; раньше (я не DV ;-))

2. @bruno Спасибо, исправлено. Я не выполнял это, это была ошибка.

3. это работает. Не хватает только точки с запятой после «int count = 5». Отличное решение.

4. @Noury хорошо, доволен. Я писал код непосредственно в редакторе, поэтому некоторые ошибки присутствовали.