600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 游戏筑基开发之结构体定义动态数组及常见问题(C语言)

游戏筑基开发之结构体定义动态数组及常见问题(C语言)

时间:2023-06-10 04:32:07

相关推荐

游戏筑基开发之结构体定义动态数组及常见问题(C语言)

定义动态数组结构体及初始化

定义结构体如下:

// 动态数组typedef struct tagVector{int* pArr;int nLen;int nLenMax;}TVector, *PTVector;

在初始化的时候,最开始想法是使用一级指针初始化即可。

定义如下:

// 初始化动态数组static int VectorInit(PTVector pv){// 创建一个结构体,在堆区PTVector pTv = malloc(sizeof(TVector));//PTVector pv = malloc(sizeof(TVector));pTv->nLen = 0;pTv->nLenMax = 10;// 申请一个长度为10的int内存空间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));//PTVector pv = malloc(sizeof(TVector));pv->nLen = 0;pv->nLenMax = 10;// 申请一个长度为10的int内存空间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);// 0 10return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。