专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

【快来看!】有意思的TC和VC有关问题

发布时间:2011-06-28 21:46:14 文章来源:www.iduyao.cn 采编人员:星星草
【快来看!】有意思的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”); // 出错

另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: