qq_43412960
2020-01-02 15:35
采纳率: 79.1%
浏览 206

这是一个关于链表结点的指针问题


#include<iostream>
#include<conio.h>
#include<string>
#include<iostream>
#include<conio.h>
using namespace std;
#define OK 1;
typedef int Status;
typedef struct 
{
string name;
float price;
}Book;
typedef  Book ElemType;
typedef struct  LNode 
{
ElemType     Elem;
LNode *Next;
}LNode,List;
Status InitList(LNode *L)
{

    L=new LNode();
    return OK;
}
int main()
{

LNode *LL;
InitList(LL);




getch();


return 0;
}


上面是我的测试代码。我想测试下链表结点,结构体指针用法。发现了一个很奇怪的现象

图片说明

InitList中的形参是结构体指针L是指针类型,也就是说L是地址。但是我调试的时候,发现L变成了值。那一堆省略号可以体现出来。这是第一个疑问。
L是子函数里的参数,调试退出子函数后,L应该消失才对,不应该有值,但调试结果显示出一堆省略号,证明它还是存在的。这是第二个疑问,求解

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • huhuren12 2020-01-02 15:55
    已采纳

    第一个问题:L值变不变都没有任何意义,这个值都是无效的,你想用也用不了,一堆省略号应该是无效的意思吧!
    第二个问题:你说L值应该消失,这个可不一定,要看编译器是怎么规定的,虽然L只无效,但是有些编译器还是显示原值,只是变成灰色,有些编译器显示的是一个红色的叉叉。 这个不一定的,但是应该都能看出来是无效的意思,另外,函数中的局部变量虽然无效了,但是那个局部变量的对应的内存地址的值还是之前的值

    已采纳该答案
    打赏 评论
  • threenewbee 2020-01-02 22:33

    你把研究的方向搞偏了。你应该学习的是C++,而不是探究VC++的调试器的各种不完善。
    VC++的调试器的问题包括之前说的,你输入的一个表达式明明是非法的,但是它判断不出来,还是试图在获取值。
    这里是VC++的调试器的另一个问题,就是对变量的生命周期的判断存在缺陷,明明L在函数外面已经不存在了,但是它的watch还在试图求值。当然它取不到,所以显示一个 ... 或者一个错误。
    这都是VC++调试器在遇到不正常的表达式的各种奇怪反应而已。
    这就好比一些大学生,遇到老师出的题目本身是错误的情况,他不去理会这个题目本身是错的,而是给出千奇百怪的解答。虽然这些大学生考试能得到高分,但是实际解决问题的能力很差。
    一个真正有能力的学生,不但具有解题的能力,还有对题目本身的批判的能力。因为你解决实际问题的时候,根本没有题目范围,你的解决思路是开放的。
    类似地,一个现代的编程语言的编译器、调试器或者解释器,它不应该只满足输入正确的代码能够运行的能力,还应该尽可能自省,也就是能发现自身状态的不正确性,能给出第一错误的具体的错误信息。使用一种在编写正确代码的时候可以工作,遇到错误的代码,无法给出任何错误提示,而是按照奇怪方式胡乱执行的编程系统,这是可怕的。

    打赏 评论

相关推荐 更多相似问题