#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 хорошо, доволен. Я писал код непосредственно в редакторе, поэтому некоторые ошибки присутствовали.