Как инициализировать указатель на указатель с предварительно подготовленными данными? - PullRequest
2 голосов
/ 29 января 2012

У меня есть указатель на указатель, так как я не могу передать динамические массивы в функции. Однако, если я хочу инициализировать этот указатель на указатель предварительно подготовленными данными, как я могу установить его, поскольку нотация {a, b, c} для массивов не будет работать для указателей?

Ответы [ 3 ]

1 голос
/ 29 января 2012

Вы можете сделать это:

static int row1[] = {1, 2, 3};
static int row2[] = {4, 5, 6, 7};
static int row3[] = {8, 9, 10, 11, 12, 13};
static int *pptr[] = {row1, row2, row3};

На этом этапе pptr может быть назначено на int**:

int **p = pptr;
0 голосов
/ 29 января 2012

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

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

typedef struct
{
  int* pValues;
  size_t Count;
} List;

const List ListEnd = { NULL, 0 };

List NewList(int Value, List SubList)
{
  List l;

  l.Count = SubList.Count + 1;

  if (SubList.Count == 0)
  {
    l.pValues = malloc(sizeof(int));
  }
  else
  {
    l.pValues = realloc(SubList.pValues, l.Count * sizeof(int));
  }

  if (l.pValues == NULL)
  {
    // do proper error handling here
    abort();
  }

  // moving data isn't necessary if the list elements are
  // in the reverse order
  memmove(&l.pValues[1], &l.pValues[0], SubList.Count * sizeof(int));

  l.pValues[0] = Value;

  return l;
}

void PrintDynArr(int* pValues, size_t Count)
{
  while (Count--)
  {
    printf("%d\n", *pValues++);
  }
}

int main(void)
{
  int* p;

  PrintDynArr(p = NewList(1,
                  NewList(2,
                  NewList(3,
                  NewList(4, ListEnd)))).pValues,
              4);

  free(p);

  return 0;
}

Вывод:

1
2
3
4
0 голосов
/ 29 января 2012

[Этот ответ актуален, только если вам нужен двойной *.Ваш вопрос был отредактирован так, чтобы указывать указатель на указатель - если это то, что вам нужно, этот ответ не имеет значения.]

Вместо этого вы можете сделать следующее:

double fValues[3] = { 1, 2, 3 };

Переменная fValues ​​уже является указателем - переменные массива без [] являются указателями на первый элемент массива.Это не динамический массив, поэтому вам не нужно выделять / освобождать его память.

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

void Func(double* pDbl) {...}

Вы бы назвали это так:

Func(fValues);

...