【问题标题】:c - malloc typedef'd pointerc - malloc typedef'd 指针
【发布时间】:2016-03-07 21:16:56
【问题描述】:

给定一个 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));,但这不是我要找的。​​p>

【问题讨论】:

  • 那么...sizeof(*double*) 是什么?
  • v = (vec_t)malloc(n*sizeof(*v)) 怎么样?
  • @EugeneSh。你告诉我。我正在尝试取消引用类型定义。
  • @User1291 我不能告诉你,因为它是你的构造,不是我的。您可以取消引用引用,而不是类型。
  • 确实意识到分配给函数参数不会改变调用者中的相应参数?

标签: c arrays pointers malloc


【解决方案1】:

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

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

v = malloc(n * sizeof *v);

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

【讨论】:

  • 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; }
【解决方案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

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2011-06-25
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多