如何在C中检查我的动态数组是否为空

时间:2016-03-02 19:26:27

标签: c arrays dynamic data-structures

我有一个像这样的动态数组:

typedef struct
{
    int *array;
    size_t used;
    size_t size;
} Vector;

我需要检查它是否为空。起初,我想,如果我没有启动它,那么大小应该是= 0,但它似乎是一个随机数。当我启动它时,所有的初始数组都是= 0,但是,它并不意味着它是空的,因为它已经被启动了...任何想法我该怎么办?

这也是我的启蒙功能:

int createVector(Vector *v, size_t initialSize)
{
    if (v->size != 0)
        return 0;
    else
    {
        int i;
        v->array = (int*)malloc(initialSize * sizeof(int));
        v->used = 0;
        v->size = initialSize;
        return 1;
    }
}

1 个答案:

答案 0 :(得分:0)

您必须先初始化Vector变量才能使用它。您不能假设它是自动初始化的,您必须明确地进行初始化。

如果没有元素,则应将其sizeused字段设置为0,将array字段设置为NULL

如果您希望createVector()执行初始化,那么您无法对Vector的当前状态做出任何假设,只是无条件地初始化它,并希望用户永远不会传入已初始化Vector已包含元素:

int createVector(Vector *v, size_t initialSize)
{
    v->array = NULL;
    v->used = 0;
    v->size = 0;

    if (initialSize > 0)
    {
        v->array = (int*) malloc(initialSize * sizeof(int));
        if (!v->array)
            return 0;
        v->size = initialSize;
    }

    return 1;
}

Vector v;
int i = createVector(&v, 10);

另一方面,如果您希望createVector()忽略其中包含元素的Vector,则必须事先对其进行初始化,以使其具有您可以检查的有效状态:

void initVector(Vector *v)
{
    v->array = NULL;
    v->used = 0;
    v->size = 0;
}

int createVector(Vector *v, size_t initialSize)
{
    if ((v->array) || (v->size != 0))
        return 0;

    v->used = 0;

    if (initialSize > 0)
    {
        v->array = (int*) malloc(initialSize * sizeof(int));
        if (!v->array)
            return 0;
        v->size = initialSize;
    }

    return 1;
}

Vector v;
int i;

initVector(&v);
i = createVector(&v, 10); // OK
i = createVector(&v, 20); // error, already created