今天讨论c的内存管理。
我记得上周在餐桌上和同事讨论c语言的兴起时,谈到了内存管理
所有指针都必须在使用前初始化,结构中的成员指针也是如此
有人反驳说不是吧,以前做二叉树算法的时候,用他左右孩子的指针的时候有初始化吗
那个时候,我想不出为什么。 虽然我相信会初始化
几天后,这位同事说他试了一下,结构体中的成员指针没有初始化就可以使用了(左子树和右子树指针)。
我那时忙于整理文档,没有在意
我今天抽了空调,结论还是需要初始化。
而且,不写代码的话就不知道原因。 (可能是对着电脑长时间智商和记性下降得很厉害) )。
测试代码如下
c代码
#包含
#包含
#包含
结构事件{
char *name;
int score;
结构稳定*下一步;
}stu,*stu1;
int main () stu.name=(char* ) malloc (sizeof ) char );
strcpy(stu.name,' Jimy ';
stu.score=99;
su1=(structstudent* ) malloc ) sizeof ) struct
student );
stu1-name=
(char** ) malloc(sizeof ) char );
stu.next=stu1;
strcpy(stu1-name,' dzc ';
stu1-score=98;
stu1-next=NULL;
printf(name%s,score %d n ),stu.name,
stu.score;
printf(name%s,score %d n
',stu1-name,stu1-score;
自由(stu1 );
返回0;
}
在写测试代码的时候就知道了,同事说的二叉树遍历算法中使用的左部分树和右部分树的指针不需要初始化。 实际上是的。 左侧和右侧树必须指向二叉树节点类型的结构指针。 你可以填一样长的指针。 此结构指针必须初始化。 也就是说,在malloc中分配其他指针的值,而不是分配内存。 (见注释2 )。
虽然突然无语,但确实,从很多大学教材来看,二叉树遍历等算法所定义的结构体只是以下形式:
c代码
结构节点{
Int数据;
结构节点*液晶屏,液晶屏;
(;
结构节点{
Int数据;
结构节点*液晶屏,液晶屏;
(;
使用时都是直接的
c代码
结构节点*根;
root=(结构节点* ) malloc ) sizeof ) struct
节点);
根-数据=3;
结构节点* nl child;
nl child=(结构节点* ) malloc ) sizeof ) struct
节点);
根池=NL池;
NL池数据=2;
结构节点* NR child;
nl rchild=(结构节点* ) malloc ) sizeof ) struct
节点);
root-rchild=nrchild;
NR-data=4;
这种情况让人产生错觉,就像结构体成员的指针没有初始化一样。
但是,只要是指针,在使用它之前就必须确保指针变量的值是有效值; 否则,它指向的内存一定是垃圾数据!
C语言的内存管理很重要,集震撼力和麻烦于一身,看看你自己的心情怎么样了。 只要你积极面对,你就控制着一切; 如果你烦躁不安,你必须控制一切。 C仍然是博大精深的语言,相信c哥哥!