我目前刚接触C编程,并且对任何提示表示赞赏。
在不删除指针标记的情况下,是否有更短的方法在C中初始化struct指针?
typedef struct {
int x, y, z;
} Point3;
typedef struct {
Point3 *pos, *direction;
} Vector;
int main() {
Vector *p;
p = malloc(sizeof(Vector));
p->pos = malloc(sizeof(Point3));
p->direction = malloc(sizeof(Point3));
return 0;
}
答案 0 :(得分:1)
是的,有一个较短的方式 - 一个malloc()
呼叫更短。
Vector *p = malloc(sizeof(Vector));
if (p != 0)
{
p->pos = malloc(2 * sizeof(Point3));
if (p->pos != 0)
p->direction = &p->pos[1];
}
分配2个Point3
值的数组。 p->pos
指向第一个,p->direction
指向第二个(反之亦然)。
但仍有3个语句(加上错误检查)和两个malloc()
的调用。
在实践中,你几乎肯定可以逃脱:
Vector *p = malloc(sizeof(Vector) + 2 * sizeof(Point3));
if (p != 0)
{
p->pos = (void *)((char *)p + sizeof(Vector));
p->direction = (void *)((char *)p + sizeof(Vector) + sizeof(Point3));
}
我不确定是否受到C标准的批准,但我无法立即想到一个合理的平台配置,它实际上无法正常工作。如果你发现一些奇怪的平台,其地址是16位,但int
是8个字节并且必须是8字节对齐,那么它将失败。但这几乎是不可信的。
答案 1 :(得分:1)
对我而言,将Point3
成员直接放在Vector
而不是指针中更有意义。分配更少,内存碎片更少,取消引用更少,缓存未命中次数更少。
typedef struct {
int x, y, z;
} Point3;
typedef struct {
Point3 pos, direction;
} Vector;
int main(void) {
/* Local (stack) allocation of a Vector, initialized to all zeros */
Vector v = {};
/* Dynamic (heap) allocation of a Vector, initialized to all zeros */
Vector *p;
p = malloc(sizeof(Vector));
if (!p) {
return 1; // failure
}
*p = (Vector){};
return 0;
}
答案 2 :(得分:0)
不幸的是,没有其他办法。您可以使用其他功能简化内存分配,例如
Vector* allocate_vector( ) {
Vector* v = (Vector*)malloc( sizeof(Vector) );
if( v == NULL ) {
/**/
}
v->pos = (Point3*)malloc( sizeof(Point3) );
if( v->pos == NULL ) {
/**/
}
v->direction = (Point3*)malloc( sizeof(Point3) );
if( v->direction == NULL ) {
/**/
}
return v;
}
然后在需要新的Vector
时使用它。
Vector* v = allocate_vector( );