c - malloc typedef'd指针

时间:2016-03-07 21:16:56

标签: c arrays pointers malloc

给定typedef'd ptr类型,我该如何访问基类型?

E.g。考虑双打的“数组”:

typedef double* vec_t;

如果我尝试这样初始化:

void init_vec(int n, vec_t v){
    v = (vec_t)malloc(n*sizeof(*vec_t));
    //...
}

gcc并不完全像那样

  

错误:'vec_t'之前的预期表达式

     

v =(vec_t)malloc(n * sizeof(* vec_t));

                      ^

这样做的正确方法是什么?

当然,我可以简单地写v = (vec_t)malloc(n*sizeof(double));,但这不是我想要的。

2 个答案:

答案 0 :(得分:4)

首先,不要将malloc()的结果强制转换为C.它返回一个void指针,它将被安全地提升为vec_t *

其次,*vec_t是尝试取消引用一种语义无效的类型。您需要取消引用vec_t类型的变量。方便的是,你有一个。

v = malloc(n * sizeof *v);

编辑:正如@chqrlie指出的那样,malloc()'内存会在返回时立即丢失。分配的地址分配给v,但调用函数的v副本不会被覆盖。

答案 1 :(得分:2)

void init_vec(int n, vec_t v)存在问题:该函数无法返回分配给调用者的指针。它应该是指向vec_t的指针,或者返回类型为vec_t的值。

一个简单的解决方案是:

vec_t init_vec(int n) {
    vec_t v = malloc(n * sizeof *v);
    //...
    return v;
}

不建议隐藏在typedef后面的指针,它往往会降低代码的可读性并且更容易出错。您的vec_t类型应该是一个结构,其中包含数组大小的size成员和指向double的指针或灵活数组。您还可以区分分配的长度size和使用的部分length

typedef struct vec_t {
    size_t size, length;
    double a[];
} vec_t;

vec_t *init_vec(size_t n) {
    vec_t *v = malloc(sizeof *v + n * sizeof(*v->a));
    v->size = v->length = n;
    for (size_t i = 0; i < n; i++) {
        v->a[i] = 0;
    }
    return v;
}

最后,由于init_vec分配了向量,因此应将其赋予更明确的名称,例如create_vecnew_vecallocate_vec