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

kgbcn 2007-06-15 01:03:09
学习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++
...全文
238 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kgbcn 2007-06-15
  • 打赏
  • 举报
回复
多谢 Chiyer(星羽)
现在对野指针了解不少了!多谢!
chenyu2202863 2007-06-15
  • 打赏
  • 举报
回复
声明了指针,需要给它所指向的地方声请内存~
楼上的说的很明白了~
星羽 2007-06-15
  • 打赏
  • 举报
回复
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是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”); // 出错

另外一个要注意的问题:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
kgbcn 2007-06-15
  • 打赏
  • 举报
回复
请问一下
什么是野指针啊?
可不可以更加概念化的解释一下啊?
  • 打赏
  • 举报
回复
但我不太理解的就是为什么在TC中可以正常编译且正常运行,但在VC中却只能正常编译通过却不能正常运行?
使用野指针,得到一个不确定的结果
kgbcn 2007-06-15
  • 打赏
  • 举报
回复
但我不太理解的就是为什么在TC中可以正常编译且正常运行,但在VC中却只能正常编译通过却不能正常运行?
taodm 2007-06-15
  • 打赏
  • 举报
回复
TC啊,17年以前的编译器了,那时候的操作系统还是dos,内存分段模式,空指针访问也不会崩溃的。
扔了吧,TC。
星羽 2007-06-15
  • 打赏
  • 举报
回复
2 同 1 指针要 分配空间啊

  • 打赏
  • 举报
回复
使用野指针,得到一个不确定的结果
星羽 2007-06-15
  • 打赏
  • 举报
回复
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;
}
  • 打赏
  • 举报
回复
2 同样是你的代码错误
  • 打赏
  • 举报
回复
1
你的代码错误

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧