0

假设我有以下结构:

typedef struct plane_t Plane;
struct plane_t{
    Point p1;
    Point p2;
    Point p3;
};

typedef struct arrangement_t* Arrangement;
struct arrangement_t{
    //TODO add fields here
    int maxPlanes;
    int curPlanes;
    Plane *planes;
};

我有以下功能:

Plane planeCreate(Point point1, Point point2, Point point3){

    Plane newPlane = {{point1.x, point1.y, point1.z}, {point2.x, point2.y, point2.z}, {point3.x, point3.y, point3.z}};
    return newPlane;
}

Arrangement arrangementCreate(int maxPlanes){

    if (maxPlanes < 1) return NULL;

    Arrangment newArrangment = malloc(sizeof struct arrangement_t);
    if (newArrangment == NULL) return NULL;
    newArrangment->planes = malloc(sizeof(Plane)*maxPlanes);
    if (newArrangment->planes == NULL) {
        free(newArrangment);
        return NULL;
    }

    newArrangment->maxPlanes = maxPlanes;
    newArrangment->curPlanes = 0;

    return newArrangment;
}

以下行是否意味着数组中的每个单元格都将具有 Plane 类型的结构,或者我仍然必须在手动创建每个单元格时一个一个地检查它们?newArrangment->planes = malloc(sizeof(Plane)*maxPlanes);

4

2 回答 2

2

malloc将为结构数组分配足够的空间maxPlanes,但由您来初始化它们。

换句话说,如果malloc成功,您将能够 newArrangement->planes[0]通过newArrangement->planes[maxPlanes-1]. 这些结构作为一个连续的块在内存中端到端布局。

于 2013-08-02T23:27:37.070 回答
1

您的代码可能(见下文)很好(“很好”是指功能性的,不是精心设计的)。您的 malloc(sizeof(Plane)*maxPlanes) 将为 maxPlanes 平面分配空间,您不必分配每个单元格。

单元格本身没有“Plane 类型的结构”,它只是一块大到足以容纳存储在 maxPlanes Plane 结构中的信息的内存块。由于您通过平面指针访问该块,因此数据将被解释为平面结构。

我说可能是因为您的 Plane 结构成员将未初始化(将包含随机数据),并且由于您没有显示 Point 是什么,因此没有足够的信息来知道您所拥有的是否足够。您也没有显示您最终将要对arrangement_t 做什么,因此我认为保留未初始化的值是可以接受的,并且您稍后将这些值设置为有意义的值。

我还会提出一些建议来澄清您的代码:

  1. 您 typedef Arrangement 作为指针,但 Plane 作为结构。我建议也许将您的 Arrangement 类型限定为 ArrangementPtr 或其他东西,以进行区分并减少混淆。

  2. 为了清楚起见,考虑使用 calloc 代替 malloc: calloc(maxPlanes, sizeof(Plane))

  3. 如果您可以接受将内存归零以进行初始化,则可以快速执行 memset(planes, 0, sizeof(Plane)*maxPlanes)。

  4. 除非您有特定的理由使用 C(有很多),否则您可能希望考虑 C++(如果您可以使用 STL 类,则使用它们),这将大大减少代码中的大量工作和可能的错误来源(请注意,这仍然不理想,因为公共成员可以破坏您可能拥有的不变量,但仅作为示例):

 

struct Plane {
    Point p1;
    Point p2;
    Point p3;
    Plane ();
    Plane (const Point &, const Point &, const Point &);
};

struct Arrangement {
    int maxPlanes;
    int curPlanes;
    std::vector<Plane> planes;
    explicit Arrangement (int maxPlanes);
};

Plane::Plane () {
}

Plane::Plane (const Point &p1, const Point &p2, const Point &p3) :
    p1(p1), p2(p2), p3(p3)
{
}

Arrangement::Arrangement (int maxPlanes) :
    maxPlanes(maxPlanes),
    curPlanes(0),
    planes(maxPlanes)
{
}

这将为您处理所有内存管理;您的工作是捕获 std::bad_alloc 以检查内存分配错误,或添加任何必要的参数验证。

您的代码还有许多其他问题或潜在问题,但我认为这超出了这个问题的范围。

于 2013-08-02T23:38:19.047 回答