c-malloc typedef';d指针
给定一个typedef'd ptr类型,如何访问基类型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 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;}