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