【快来看!】有意思的TC和VC问题!
学习C/C++ 也有一段时间了,一直在同时使用TC与VC两款编译器,发现在使用指针的时候有一个挺有意思的现象:
1.指针在赋值的时候:
#include "iostream.h "
void main()
{
int *p,x;
cin> > x;
*p=x; //这一行在VC中可正常编译,但在运行时会出错,退出程序。必须改成 p=&x; 但TC则没有问题。
cout < <endl < <p < <endl < <endl < <*p < <endl;
}
该代码用TC和VC都可以编译通过,但是用VC编译的程序在运行过程中会出现程序错误,程序会被中止,必须将 *p=x; 改成 p=&x;才能正常运行,可是在TC中 *p=x; 和 p=&x 这两行无论那一行都可以正常运行。
2.在结构体中:
这个就更奇怪了
#include "iostream.h "
typedef struct studend
{
int num;
char name[8];
}stud;
void main()
{
stud *k;
k=new stud; //这一行加与不加在TC中都可以正常编译并正常运行,但在VC中如果不加的话只能正常编译,运行时却会出错退出程序。
cout < < "输入编号: ";
cin> > k-> num;
cout < < "输入姓名: ";
cin> > k-> name;
}
想请问一下,上面这些代码出错到底是因为TC与VC中的那些不同造成的啊?
TC编译器和VC编译器到还有那些区别啊?
请大家帮帮忙啊?
我说的TC是指支持C++的Turbo C++
[解决办法]
1,当然会当拉 你的p都没初始化啊
改这样就不会有问题了
int main()
{
int *p,x;
p = new int;
cin> > x;
*p=x;
cout < <endl < <p < <endl < <endl < <*p < <endl;
delete p;
return 0;
}
[解决办法]
使用野指针,得到一个不确定的结果
[解决办法]
TC啊,17年以前的编译器了,那时候的操作系统还是dos,内存分段模式,空指针访问也不会崩溃的。
扔了吧,TC。
[解决办法]
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。