定义动态数组结构体及初始化
定义结构体如下:
typedef struct tagVector
{
int* pArr;
int nLen;
int nLenMax;
}TVector, *PTVector;
在初始化的时候,最开始想法是使用一级指针初始化即可。 定义如下:
static int VectorInit(PTVector pv)
{
PTVector pTv = malloc(sizeof(TVector));
pTv->nLen = 0;
pTv->nLenMax = 10;
pTv->pArr = malloc(sizeof(int) * 10);
ppv = pTv;
return 1;
}
int main()
{
PTVector pv = NULL;
VectorInit(pv);
return 0;
}
结果加断点运行后结果出错,pv结构体指针仍然NULL。 之后经过思考,发现一个致命的bug。就是局部变量是具有生命周期的,终止于函数结束。局部变量如果指向的不是一个地址,那么值是无法更改的。只有修改pv存储地址对应的值才可以。 正确的定义如下:
static int VectorInit(PTVector* ppv)
{
PTVector pv = malloc(sizeof(TVector));
pv->nLen = 0;
pv->nLenMax = 10;
pv->pArr = malloc(sizeof(int) * 10);
*ppv = pv;
return 1;
}
int main()
{
PTVector pv = NULL;
VectorInit(&pv);
printf("%d %d\n", (*pv).nLen, (*pv).nLenMax);
return 0;
}
|