在最少的源代码行中初始化结构中的指针

时间:2015-01-27 02:21:58

标签: c

我目前刚接触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;
}

3 个答案:

答案 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( );