C语言中,数组初始化的方式主要有以下几种:
1.对数组中所有的数组元素赋予初值
2.只给数组中一部分元素赋予初值
今天在做课设的时候,突然想用变量初始化数组,
于是我定义了一个结构体指针变量,然后定义了一维结构体指针数组,
使用该结构体指针对结构体指针数组赋予初值。
于是有这样子的代码
BBSTree level1_1 = NULL; //结构体指针变量
BBSTree Tree[] = {level1_1}; //结构体指针变量数组
在我的想法中,这样做相当于把level_1指针放入指针数组Tree中,
从这个观点出发的话,那对于Tree[0]的修改就是对于level_1的修改。
在这个错误观念的驱使下就有如下愚蠢的操作:
错误的操作
Tree[0] = (BBSTree)malloc(sizeof(struct BBSTNode)); //赋予地址
Tree[0]->data = 0; //对各成员变量赋值
Tree[0]->bf =0;
Tree[0]->lchild = NULL;
Tree[0]->rchild = NULL;
然而实际上呢?
这就要回归文章开头关于数组初始化的方式了。
1.对数组中所有的数组元素赋予初值
这句话的重点在于赋予初值。
赋予初值意味着数组元素有自己单独的存储空间可以存放数据(不然哪来的赋予初值?),
赋予初值也只是把指针变量里的值赋予数组元素,
也就是说:
数组元素和对数组元素进行初始化的变量有着不同的存储空间,对其中一个操作对另一个操作并没有任何影响。
那么对于Tree[0]进行的操作对于level _1没有任何影响,也不能实现原先的想法。
对于正确的操作应该是使用一个指向结构体指针的指针的数组(这句话有点绕),通过对指针的解引用来实现原先的想法。
应该把代码改成这个样子:
正确操作
BBSTree level1_1 = **NULL**; //结构体指针变量
BBSTree* Tree[] = {&level1_1}; //指向结构体指针的指针数组
*Tree[0] = (BBSTree)malloc(sizeof(struct BBSTNode)); //赋予地址
(*Tree[0])->data = 0; //对各成员变量赋值
(*Tree[0])->bf =0;
(*Tree[0])->lchild = NULL;
(*Tree[0])->rchild = NULL;
网友评论