繁体   English   中英

c-malloc类型定义的指针

[英]c - malloc typedef'd pointer

给定typedef的ptr类型,如何访问基本类型?

例如,考虑双打的“数组”:

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)); ,但这不是我想要的。

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

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

v = malloc(n * sizeof *v);

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

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;
}

不建议将指针隐藏在typedefs后面,因为它会使代码可读性降低,并且更容易出错。 您的vec_t类型实际上应该是一个结构,其中包含用于数组大小的size成员以及指向double或flexible数组的指针。 您还可以区分分配的长度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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM