LINUX.ORG.RU

Вопрос про выделение памяти в С функции.


0

0

Доброго времени суток.
Вопрос такой: есть функция, которая должна возвращать массив данных. Число элементов массива заранее не определено, поэтому последний должен использоваться динамически. Сейчас это сделано так: объявлен глобалый указатель, и в теле функции память выделяется для него обычным образом. Но хотелось бы сделать функцию полностью автономной.
Вот так:

main.c:
...
int main ()
{
Tchem * array=NULL;
...
result=get_data(handle, array, &count);
...
}

util.c:
int get_data(FILE *hnd, Tchem *arr, int *count)
{
...
/* подсчёт элементов в count */
...
arr=(Tchem *)malloc(count*sizeof(Tchem));
...
}

естественно не получается.
Можно ли как-нибудь это сделать, не используя глобальную переменную?

★★

Разумеется так не пойдет. Но что мешает передавать указатель на указатель?

main.c:
    [...]
int main ()
{
    Tchem* array=NULL;
    [...]
    result = get_data(handle, &array, &count);
    [...]
}

util.c:
int get_data(FILE *hnd, Tchem **arr, int *count)
{
    [...]
    /* подсчёт элементов в count */
    [...]
    *arr = (Tchem*)malloc(count * sizeof(Tchem));
    [...]
}

WFrag ★★★★
()
Ответ на: комментарий от WFrag

#include <stdio.h>

void get_data(int ** arr)
{
  *arr=(int *)malloc(3*sizeof(int));
  *arr[1]=1;
  *arr[2]=2;
  *arr[3]=3;
  return;
}


int main (int argc, char ** argv)
{
  int * arr;
  int i;

  get_data(&arr);
  for (i=0; i<3; i++)
    printf ("%d\n",arr[i]);
  return 1;
}

Вроде этого? Я так пробовал, оно у меня сегфолтится :(

octy ★★
() автор топика
Ответ на: комментарий от octy

Всё, спасибо огромное, это я ступил... Забыл про порядок 
разыменовывания...

Правильно (*arr)[1]=1; и т.д.
Ну а про индексы в моём примере - это надо больше спать ... (%

octy ★★
() автор топика
Ответ на: комментарий от octy

> Я так пробовал, оно у меня сегфолтится :(

> *arr[1]=1;

 (*arr)[1]=1;

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.