如果我有以下C结构:
struct group_of_pointers {
double *p1, *p2, *p3;
} *pointers;
现在,我想将n个空格(每个都带有sizeof 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)
前者看起来有点混乱,输入和输出全部捆绑在一起。但这只是C的方式吗?
答案 0 :(得分:3)
是的,你必须首先为指针结构分配空间。然后为每个组件分配。
pointers = malloc(sizeof *pointers);
pointers->p1 = malloc(n * sizeof(double));
pointers->p2 = malloc(n * sizeof(double));
pointers->p3 = malloc(n * sizeof(double));
答案 1 :(得分:2)
是的,因为你的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));
答案 2 :(得分:1)
如果我正确地读了你的问题,是的,你需要'指针'结构来获得空间,无论是分配还是在堆栈上,你需要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故障,所以这段代码不能被认为是生产就绪的!
答案 3 :(得分:1)
你想做什么?需要一个可以指向三个double值的结构吗?然后是的,你需要为任何这些对象分配内存:
#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;
}
答案 4 :(得分:1)
如果这三个数组高度相关,并且你经常将它们作为一个组使用,你应该使用第二种方法,但不是在堆上创建一个结构,你应该在堆栈上创建它然后将它的指针传递给你的函数,像
void foo(struct group_of_pointers * ptr,const double * input);