Программирование на C: malloc () внутри функции - PullRequest
1 голос
/ 16 марта 2019

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

Вот мой код:

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

int getNetworks(char **networks) {

  networks = malloc(5 * sizeof(char*));
  printf("networks in function:%p\n", 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:%p\n", networks);
  nbNetworks = getNetworks(&*networks);
  printf("networks after call:%p\n", networks);
  for (int i=0; i<=nbNetworks-1; i++) {
    printf ("%s\n", networks[i]);
  }
  return 0;
}

Вывод

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

Ответы [ 2 ]

3 голосов
/ 16 марта 2019

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

int getNetworks(char ***networks)

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

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

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

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

    getNetworks(&networks);

чтобы функция могла работать с родительской переменной.

1 голос
/ 16 марта 2019

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

#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:%p\n", 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:%p\n", networks);
  networks = getNetworks(&nbNetworks);
  printf("networks after call:%p\n", networks);
  for (int i=0; i < nbNetworks; i++) {
    printf ("%s\n", networks[i]);
  }
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...