Передача указателей для выделения памяти внутри функции? - PullRequest
0 голосов
/ 08 января 2012

Мне нужно разместить массивы структур в куче разных мест в моей программе, таким образом поместив работу в функцию (VS 2010).Компилятор выдает предупреждение об использовании неинициализированной переменной.Итак, как мне передать это и как объявить это в функции.Я пробовал много вариантов "&" и "*", но безрезультатно.

(заранее извиняюсь, если мой код вызывает какую-либо форму тошноты ... Я англичанинмайор.)

struct s_stream {
int blah;
};

void xxyz(void)
{
    struct s_stream **StreamBuild;
    char *memBlock_1;

    xalloc(StreamBuild, memBlock_1, 20);
}



void xalloc(struct s_stream **StreamStruct, char *memBlock, int structCount)
{
    int i = sizeof(struct s_stream *);
    if ((StreamStruct=(struct s_stream **) malloc(structCount * i)) == NULL)
        fatal("failed struct pointer alloc");

    int blockSize = structCount * sizeof(struct s_stream);
    if ((memBlock = (char *) malloc(blockSize)) == NULL)
        fatal("failed struct memBlock alloc");

    // initialize all structure elements to 0 (including booleans)
    memset(memBlock, 0, blockSize);

    for (int i = 0; i < structCount; ++i)
       StreamStruct[i]=(struct s_stream *) &memBlock[i*sizeof(struct s_stream) ];
}

Ответы [ 3 ]

3 голосов
/ 08 января 2012

Я не совсем уверен, что понимаю ваш вопрос, но, похоже, вам нужна функция, которая создаст динамически распределенный массив объектов struct s_stream и вернет их вызывающей стороне.Если это так, то это довольно просто:

void easiest(void)
{
  struct s_stream *array = malloc(20 * sizeof(struct s_stream));
}

Вы можете перевести malloc() в его собственную функцию и вернуть указатель:

void caller(void)
{
   struct s_stream *array = create_array(20);
}

struct s_stream *create_array(int count)
{
  return malloc(count * sizeof(struct s_stream));
}

Или, если вы настаиваете на передачемассив в качестве параметра:

void caller(void)
{
   struct s_stream *array;
   create_array(&array, 20);
}

void create_array(struct s_stream **array, int count)
{
  *array = malloc(count * sizeof(struct s_stream));
}
0 голосов
/ 08 января 2012

Вы передаете копию указателя memBlock_1 в xalloc, поэтому адрес, возвращаемый malloc, записывается в копию и никогда не достигает вызывающей функции. Поскольку вы, вероятно, хотите, чтобы адрес был доступен для xxyz в memBlock_1, вы должны передать указатель на указатель на символ в качестве второго аргумента,

void xalloc(..., char **memBlock, ...)

и позвоните по номеру xalloc(..., &memBlock_1, ...);. В теле xalloc заменить все вхождения memBlock на *memblock, например, (*memblock = malloc(blockSize)) == NULL (не нужно кастовать).

Аналогично, параметр StreamStruct в xalloc никогда не изменяет StreamBuild указатель на указатель на структуру s_stream в xxyz. Если я правильно интерпретирую ваши намерения, вам также придется добавить слой указателя к этому параметру, void xalloc(struct s_stream ***StreamStruct, ..., ...), передать адрес StreamBuild в вызове, xalloc(&StreamBuild, ..., ...) и разыменовать указатель в теле функции, например, (*StreamStruct = malloc(structCount * i)) == NULL.

0 голосов
/ 08 января 2012

Есть ли причина, по которой вы не используете обычный массив? Например;

struct s_stream* streamArray = malloc(sizeof(s_stream*structCount));

Тогда у вас есть массив s_stream, к которому вы можете просто обратиться с помощью streamArray [0] к streamArray [structCount-1] без разыменования каких-либо дополнительных указателей.

...