2016-03-07 71 views
1

给定一个typedef'd ptr类型,我该如何访问基类型?c-malloc typedef'd pointer

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

typedef double* vec_t; 

如果我尝试初始化这样的:

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

GCC不完全一样

error: expected expression before ‘vec_t’

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

    ^

什么是正确的方法去做这个?

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

+0

那么...... sizeof(* double *)'是什么? –

+0

'v =(vec_t)malloc(n * sizeof(* v))''? –

+0

@EugeneSh。你告诉我。我试图解引用类型定义。 – User1291

回答

4

首先,不要在C中输入malloc()的结果。它返回一个void指针,它将安全地提升为vec_t *

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

v = malloc(n * sizeof *v); 

编辑:@chqrlie指出的那样,malloc()倒是内存立即失去了回报。分配的地址分配给v,但调用功能的v副本不会被覆盖。

+1

void init_vec(int n,vec_t v)'存在一个问题:该函数无法将分配的指针返回给调用者。它应该带一个指向'vec_t'的指针,或者返回一个值。它应该是:'vec_t init_vec(int n){vec_t v = malloc(n * sizeof * v); ... return v; }' – chqrlie

+0

@chqrlie好点,我已经添加到我的答案。 –

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