c-malloc typedef';d指针

c-malloc typedef';d指针,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,给定一个typedef'd ptr类型,如何访问基类型 例如考虑双倍的“数组”: typedef double* vec_t; 如果我尝试这样初始化: void init_vec(int n, vec_t v){ v = (vec_t)malloc(n*sizeof(*vec_t)); //... } gcc并不是这样的 错误:“vec\u t”之前应为表达式 v=(向量)malloc(n*sizeof(*vec_t)) 正确的方法是什么 当然,我可以简单地编写v=(vec_

给定一个typedef'd ptr类型,如何访问基类型

例如考虑双倍的“数组”:

typedef double* vec_t;
如果我尝试这样初始化:

void init_vec(int n, vec_t v){
    v = (vec_t)malloc(n*sizeof(*vec_t));
    //...
}
gcc并不是这样的

错误:“vec\u t”之前应为表达式

v=(向量)malloc(n*sizeof(*vec_t))

正确的方法是什么


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

首先,不要在C中强制转换
malloc()
的结果。它返回一个空指针,该指针将安全地升级为
vec\u t*

第二,
*vec\u t
是试图取消对类型的引用,这在语义上是无效的。您需要取消引用
vec\u t
类型的变量。很方便,你有一个

v = malloc(n * sizeof *v);

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

首先,不要在C中强制转换
malloc()
的结果。它返回一个空指针,该指针将被安全地提升到
vec\u t*

第二,
*vec\u t
是试图取消对类型的引用,这在语义上是无效的。您需要取消引用
vec\u t
类型的变量。很方便,你有一个

v = malloc(n * sizeof *v);

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

void init_vec(int n,vec_t v)
存在问题:函数无法将分配的指针返回给调用方。它应该获取指向
vec\u t
的指针,或者返回
vec\u t
类型的值

一个简单的解决方案是:

vec_t init_vec(int n) {
    vec_t v = malloc(n * sizeof *v);
    //...
    return v;
}
不建议将指针隐藏在typedef后面,这会降低代码的可读性,并且更容易出错。您的
vec\u 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;
}
typedef结构向量{
尺寸、尺寸、长度;
双a[];
}向量;
向量*初始向量(大小){
vec_t*v=malloc(sizeof*v+n*sizeof(*v->a));
v->size=v->length=n;
对于(大小i=0;ia[i]=0;
}
返回v;
}

最后,由于
init\u vec
分配向量,因此应该给它一个更明确的名称,例如
create\u vec
new\u vec
allocate\u vec

无效init\u vec(int n,vec\u t v)
:函数无法将分配的指针返回给调用方。它应该获取指向
vec\u t
的指针,或者返回
vec\u t
类型的值

一个简单的解决方案是:

vec_t init_vec(int n) {
    vec_t v = malloc(n * sizeof *v);
    //...
    return v;
}
不建议将指针隐藏在typedef后面,这会降低代码的可读性,并且更容易出错。您的
vec\u 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;
}
typedef结构向量{
尺寸、尺寸、长度;
双a[];
}向量;
向量*初始向量(大小){
vec_t*v=malloc(sizeof*v+n*sizeof(*v->a));
v->size=v->length=n;
对于(大小i=0;ia[i]=0;
}
返回v;
}

最后,由于
init_vec
分配向量,因此应该给它一个更明确的名称,例如
create_vec
new_vec
allocate_vec

,因此。。。什么是
sizeof(*double*)
?如何
v=(vec_t)malloc(n*sizeof(*v))
?@EugeneSh。你告诉我。我试图取消引用类型定义。@User1291我不能告诉您,因为它是您的构造,而不是我的。您可以取消引用,而不是类型。您是否意识到分配给函数参数不会更改调用方中相应的参数?因此。。。什么是
sizeof(*double*)
?如何
v=(vec_t)malloc(n*sizeof(*v))
?@EugeneSh。你告诉我。我试图取消引用类型定义。@User1291我不能告诉您,因为它是您的构造,而不是我的。您可以取消引用,而不是类型。您确实意识到分配给函数参数不会更改调用者中相应的参数吗?
void init_vec(int n,vec_t v)
存在问题:函数无法将分配的指针返回给调用者。它应该取一个指向向量的指针,或者返回一个值。它应该是这样的:
vec\u t init\u vec(int n){vec\u t v=malloc(n*sizeof*v);…return v;}
void init\u vec(int n,vec\u t v)
有一个问题:函数无法返回分配给调用方的指针。它应该取一个指向向量的指针,或者返回一个值。它应该是:
vec\u t init\u vec(int n){vec\u t v=malloc(n*sizeof*v);…return v;}