我有一个像这样的动态数组:
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;
}
}
答案 0 :(得分:0)
您必须先初始化Vector
变量才能使用它。您不能假设它是自动初始化的,您必须明确地进行初始化。
如果没有元素,则应将其size
和used
字段设置为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