выделение массива внутри функции переменного тока - PullRequest
3 голосов
/ 14 ноября 2010

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

Это была моя последняя почти рабочая попытка

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

int func(int **thing);

int main() {

 int *thing;

 func(&thing);

 printf("%d %d", thing[0], thing[1]);
}

int func(int **thing) {

 *thing = calloc(2, sizeof(int));

 *thing[0] = 1;
 *thing[1] = 2; 

 printf("func - %d %d \n", *thing[0], *thing[1]);
}

но значения, напечатанные вне функции, равны 1 и 0. Есть много документации по указателям, но я не нашел этого конкретного случая. Любые советы о том, что я делаю не так?

Ответы [ 5 ]

6 голосов
/ 14 ноября 2010

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

int *func();

int main() {

 int *thing;

 thing = func();

 printf("%d %d", thing[0], thing[1]);
}

int *func() {

 int *thing;

 thing = calloc(2, sizeof(int));

 thing[0] = 1;
 thing[1] = 2; 

 printf("func - %d %d \n", thing[0], thing[1]);

 return thing;
}

Причина, по которой ваш код не работает, заключается в следующем:

*thing[0]

Из-за приоритета операторов вы должны использовать:

(*thing)[0]
5 голосов
/ 14 ноября 2010

Приоритет * и [] таков, что ваши назначения означают *(thing[0])Вам нужно явно заключить в скобки как (*thing)[0].

3 голосов
/ 14 ноября 2010

Внутри func(), *thing[n] эквивалентно *(thing[n]), то есть *(*(thing + n)), то есть индексирование массива имеет приоритет над разыменованием. Вы должны назначить, используя (*thing)[n].

1 голос
/ 14 ноября 2010

[] имеет более высокий приоритет, чем разыменование.Используйте явный паратез: (*thing)[0] = 1;

0 голосов
/ 14 ноября 2010

После использования () для правильного приоритета не забудьте изменить *thing = calloc(2, sizeof(int)); на thing = calloc(2, sizeof(*int)); и выделить память для thing элементов, так как его элементы являются указателями на целые числа.

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