C++链表头插法实现中多次创建同名局部变量v无报错原因问询
问题原理解答
你产生疑问的核心是对局部变量的作用域规则、以及指针变量和它指向的堆内存实例的区别认知不清晰,具体解释如下:
- 你在
Insert函数内定义的Node* v属于块级作用域的局部自动变量,它的生命周期仅存在于当前这一次Insert函数的调用周期内,函数执行结束后这个名为v的指针变量本身就会被栈回收。多次调用Insert时,每次创建的v都处于独立的函数调用栈帧中,是完全独立的临时变量,不会产生命名冲突,这种规则和Java方法内的局部变量规则完全一致:不同次方法调用的同名局部变量互不干扰,不会触发重名报错。 - 你混淆了指针变量
v和它指向的Node实例:new Node的操作是在堆内存上创建全新的Node类实例,v只是用来临时存储这个实例内存地址的工具变量,最终你已经把这个实例的地址赋值给了SList的成员变量head托管,就算函数执行完v被销毁,堆上的Node实例依然存在,且已经被链表结构关联,不会丢失也不会和其他实例冲突。
补充代码问题提示:你当前的代码里
Insert函数接收的参数是int key,但给节点赋值时写的是v->elem = e,这里的e属于未定义变量,实际编译会报错,需要改成v->elem = key才能正常运行。
内容的提问来源于stack exchange,提问作者lcazier
相关产品推荐
相关产品推荐

