简单问题非常奇怪,关于指针,难道是bug?

冰矿 2008-04-25 12:43:32
这次栽了,栽一简单问题上。

#include<stdio.h>
int main()
{
int x=3;
int *px;
*px = x;
printf("%d\n",*px);

system("PAUSE");
return 0;
}

如此简单的程序在DEC C++上编译通过但运行出错,提示"。。。。该内存不能为written";
改成如下,即多定义一个变量,然后就可以运行了。

#include<stdio.h>
int main()
{
int x=3,y;
int *px;
*px = x;
printf("%d\n",*px);

system("PAUSE");
return 0;
}

谁给解释下,这是怎么回事?
...全文
417 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
ake1988 2008-04-29
  • 打赏
  • 举报
回复
建议楼主在看一下y的值是不是和*px的输出一样,如果一样。估计,肯能,大概,猜想一下。这编译器太智能了了。
居然能自动让野指针指向一个未赋值的空间。还能在换种方式验证一下。我没那么先进的编译器不能试。

loveisbug 2008-04-28
  • 打赏
  • 举报
回复
楼主既然那么想知道第二种情况为什么这样,那为什么就不单步一下看看px,&x,&y分别是多少呢?
ahjxysq 2008-04-26
  • 打赏
  • 举报
回复
*px = x;//你的意思是往PX所指向的变量赋值为x; 但是 PX并没有指向变量
jeff_nie 2008-04-26
  • 打赏
  • 举报
回复
42楼解释的很好!
icoding 2008-04-26
  • 打赏
  • 举报
回复
如果你让我头像里的MM请我帮忙,我可以帮你去看汇编码
clhposs 2008-04-25
  • 打赏
  • 举报
回复
TC 不标准 上次我的字符串没有'\0'他竟然可以输出来不出错

但是到VC就出了问题
Inhibitory 2008-04-25
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
int x=3;
int *px;
*px = x; // px都没有分配内存, 怎么能直接使用呢? 没有分配的内存直接使用会导致致命错误而使用程序退出.
printf("%d\n",*px);

system("PAUSE");
return 0;
}

TC, 很老的环境了, 最主要的是实际上你的程序是有问题的.
clhposs 2008-04-25
  • 打赏
  • 举报
回复

*px = x;//你的意思是往PX所指向的变量赋值为x; 但是 PX并没有指向变量
冰矿 2008-04-25
  • 打赏
  • 举报
回复
那为什么,第二个程序就可以啊?
这个是C99问题,还是编译器本身的问题?
clhposs 2008-04-25
  • 打赏
  • 举报
回复

*px = x;//指针没有初始化
clhposs 2008-04-25
  • 打赏
  • 举报
回复
*px = &x;
冰矿 2008-04-25
  • 打赏
  • 举报
回复
TC下都没问题,
有DEC C++的可以尝试一下,
冰矿 2008-04-25
  • 打赏
  • 举报
回复
多谢各位热烈讨论。分太少,全当娱乐一回好了。
无敌小奇 2008-04-25
  • 打赏
  • 举报
回复
汗,我也没报错...
cyou2008 2008-04-25
  • 打赏
  • 举报
回复
相当无语...
晨星 2008-04-25
  • 打赏
  • 举报
回复
阿荣已经把话说到家了,呵呵。
arong1234 2008-04-25
  • 打赏
  • 举报
回复
无论那种情况,指针都是随机的。这种随机性可以使你的指针指向可写区域和不可写区域都使可能的。当你指针指向可写区域时,就不会报异常,但是如果指向不可写区域,程序就爆了。至于为什么第二种一直成功,这就要问你是否测试了所有情况了,当然你可嫩测试一辈子都不会遇到一种崩的情况,但是从理论上你应该会碰到异常,如果你愿意一个一个情况去测试的话。这种测试也不能用这么简单得代码,你至少搞一个有几十万行代码得软件,才能增加被hit得几率

错误的代码就是炸弹,一定要研究“我错了但是为什么没人惩罚我”,这时毫无意义的,就好象你做了小偷,那也得被人抓了才会受到惩罚啊。如果一旦错了就立刻收到惩罚,这世界也太容易了。
[Quote=引用 32 楼 icemine 的回复:]

多谢各位朋友热情参与,
有些朋友并没有理解我的意思;
程序肯定不对,这个都知道的。

我跟朋友说这个不能运行的,
但是人家就是这个第二个程序屡试不爽,Dev C++上!
我试了试也是这样,在Dev C++上从来没出错误,你说让我怎么办!
颜面扫地。。。。

都是错误的程序,为什么第一个不行第二个却屡屡得手呢?
都是没有初始化了的,那差别咋就那么大涅?。
[/Quote]
arong1234 2008-04-25
  • 打赏
  • 举报
回复
错误代码不一定把错误显示给你,虽然你加了变量问题就不出来,不代表你程序没造成破坏,只是破坏还没有显示出来而已。
[Quote=引用 4 楼 icemine 的回复:]
那为什么,第二个程序就可以啊?
这个是C99问题,还是编译器本身的问题?
[/Quote]
ligeng0774 2008-04-25
  • 打赏
  • 举报
回复
要先对指针进行初始化操作,即*px = x;
sheenl 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 gaofanfan 的回复:]
同意6楼的意见,px指针必须先申请空间啊。
int *px只是定义了一个int型的指针,你并没有给他内存空间,就直接把int型的x变量赋给px指针
这能正确嘛?
至于在定义一个y就正确了,是因为px定义的指针就指在了y的空间上,因此把x赋给px指针,就刚好正确了。
[/Quote]

不能想当然, 实际上, 在mingw32的编译器中, 不开优化的话, px的地址不但不等于y, 而且差的很远. (开优化的话, px指像非法区域, 程序会崩溃.)
加载更多回复(31)

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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