C указатель на структуру с элементами, которые являются указателями - как выделить память и использовать в качестве вывода функции - PullRequest
1 голос
/ 24 января 2012

Если у меня есть следующая структура C:

struct group_of_pointers {
    double *p1, *p2, *p3;
} *pointers;

Теперь я хочу выделить n пробелов (каждый с размером double) для указателей-> p1, указателей-> p2, указателей-> p3. Как мне это сделать? Нужно ли выделять какое-либо место для указателя на саму структуру «указатели»?

Спасибо.

ETA: связанный вопрос: Мне нужна эта структура, потому что я хочу вернуть 3 массива переменной длины из функции. Должен ли я просто сделать

void foo(const double* const input, double *output1, double *output2, double *output3) 

или я должен сделать

struct group_of_pointers *foo(const double* const input)

Первый выглядит немного запутанным с входом и выходом, все вместе. Но так ли это, как С?

Ответы [ 5 ]

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

Да, вы должны сначала выделить место для структуры указателей. Затем вы выделяете для каждого компонента.

pointers = malloc(sizeof *pointers);
pointers->p1 = malloc(n * sizeof(double));
pointers->p2 = malloc(n * sizeof(double));
pointers->p3 = malloc(n * sizeof(double));
2 голосов
/ 24 января 2012

Да, поскольку ваша переменная pointers сама по себе является указателем, вам нужно выделить ей немного памяти для указания.

struct group_of_pointers {
    double *p1, *p2, *p3;
} *pointers;

pointers = malloc(sizeof(*pointers));

pointers->p1 = malloc(n*sizeof(*pointers->p1));
pointers->p2 = malloc(m*sizeof(*pointers->p2));
pointers->p3 = malloc(o*sizeof(*pointers->p3));
1 голос
/ 25 января 2012

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

void foo (struct group_of_pointers * ptr, const double * input);

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

Что вы пытаетесь сделать?Нужна ли структура, которая может указывать на три двойных значения?Тогда да, вам нужно выделить память для любого из этих объектов:

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

struct group_of_pointers {
    double *p1, *p2, *p3;
} *pointers;

int main(int argc, char *argv[]) {

   pointers = malloc(sizeof(struct group_of_pointers));
   pointers->p1 =  malloc(sizeof(double));
   pointers->p2 =  malloc(sizeof(double));
   pointers->p3 =  malloc(sizeof(double));

   *(pointers->p1) = 10.0;
   *(pointers->p2) = 20.0;
   *(pointers->p3) = 30.0;

   printf("%lf %lf %lf\n", *(pointers->p1), *(pointers->p2), *(pointers->p3));

   return EXIT_SUCCESS;
}
1 голос
/ 24 января 2012

Если я правильно читаю ваш вопрос, да, вам нужна структура 'pointers', чтобы иметь место, выделенное или в стеке, а вы malloc () или его вариант пространство для p1 - p3:

struct group_of_pointers *pointer = malloc(sizeof(*pointer));

pointer->p1 = malloc(n * sizeof(double));
pointer->p2 = malloc(n * sizeof(double));
pointer->p3 = malloc(n * sizeof(double));

/* do stuff here... */

free(pointer->p1);
free(pointer->p2);
free(pointer->p3);
free(pointer);

Конечно, я никогда не проверял наличие сбоев malloc, поэтому этот код не должен считаться готовым к работе!

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