免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3264 | 回复: 10
打印 上一主题 下一主题

在探究段错误的过程中产生了一些疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-27 22:15 |只看该作者 |倒序浏览
自己在linux下我写程序时不时地会遇到段错误,我只知道那肯定是非法访问内存时引发的错误,有时自己改一下代码后来就运行通过了,一直没有深究过.可当自己写的代码越来越长时,一旦出现段错误往往很难及时排除问题.
我不打算再迁就下去,就去google了一下.
查了一些资料,知道段错误最主要的原因无非有二:1数组越界访问.2.试图向本来保留给操作系统的内存空间写入值.(如内存地址为0的单元).自己为探究段错误写了以下代码.
例如程序段1
char * ptr[12];
fgets(ptr[0],100,stdin);
运行时会产生段错误,我做了一下假设:声明一个指针数组时每个指针对象都会被给初值0,所以试图向地址为0的内存单元写值时就会产生段错误.我用printf("%p",ptr[0]);发现自己的假设又是错误的,ptr[0]中的地址值不是0,但是我仍然认为指针末初始化前里面的值是一个不准写入数据的地址
对程序段2
int * p;
scanf("%d",p);
我猜想同样应该产生段错误的,结果在linux下确实运行时出现了段错误,但在windows下(DEV C++4.9.9)下却运行通过。
我又改了一下程序段3
char * p;
scanf("%c",p)
这段程序在linux下运行时不会产生任何操作,想不通,windows下却运行时报错。
最后改成程序段4
char p;
scanf("%c",&p)
结果运行通过。
我产生了以下疑问?
1.关程序段1我的看法对不对,如果不对原因又是什么?
2.对于程序段2各3在windows下为什么int *就没问题,而char *就有问题?在linux下程序段2产生段错误的原因又何在呢?
3.程序段3为什么在linux下没产生任何操作,程序段3和程序段4最大的不同何在?
希望得到大家的帮助,先谢谢了!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-27 23:08 |只看该作者
1。〉〉但是我仍然认为指针末初始化前里面的值是一个不准写入数据的地址
指针变量如果不明确赋值,里面的值是随机的,
也就是可能指向任何地方。
2。你不给指针分配指向的空间而运行又不出错,这个也是随机的,
你不能保证在任何情况下每次都不出错。
3。答案同2。

论坛徽章:
0
3 [报告]
发表于 2007-03-28 02:20 |只看该作者
程序段3和程序段4最大的不同何在?

程序段3 你定义了一个指针变量,没有分配空间,操作结果是未知的

程序段4 你定义了一个字符型变量,其存储空间在当前的栈上,scanf 只是往这个空间里添数据罢了(&p)

论坛徽章:
0
4 [报告]
发表于 2007-03-28 10:40 |只看该作者
对二位的解答,我还是有一些疑惑。既然指针在末初始化前里面的值是随机的,也就是说存在能够正常运行的可能。但是如
char *p;
fgets(p,100,stdin);
这样的代码为什么每次运行时都要报错(Segmentation faults),这是编译器的特性所决定的吗?

论坛徽章:
0
5 [报告]
发表于 2007-03-28 10:45 |只看该作者
请不要孤立的学习语言.
结合运行环境考虑.
明确说, 分析一个已经错误的方法其实某种意义上浪费时间, 中国教育的典型错误.
你了解些OS的东西, 就能清楚很多问题的产生了^^

所以不要执着于产生段错误, 其实这些错误熟练后比较容易避免的.

论坛徽章:
0
6 [报告]
发表于 2007-03-28 11:32 |只看该作者
可能我的看法有点肤浅,觉得刚才自己提的问题并不一定非得在操作系统的层面给我解答,我只需要从语言角度告诉我什么会报错?
>明确说, 分析一个已经错误的方法其实某种意义上浪费时间, 中国教育的典型错误。
我不同意你这个观点,中国教育的真正悲哀在于不敢去问太多为什么,在对很多问题做出细致的思考之前就下定论某个问题不值得去思考。如果我所思考的问题现在不在自己的知识和能力范围内没关系,我会努力去提高自己在以后的时间内去理解它解决它,这是我对自己的承诺。
但是现在,我所需要的是更具建设性的回复,谢谢。

论坛徽章:
0
7 [报告]
发表于 2007-03-28 12:09 |只看该作者
原帖由 believetruelove 于 2007-3-28 11:32 发表
可能我的看法有点肤浅,觉得刚才自己提的问题并不一定非得在操作系统的层面给我解答,我只需要从语言角度告诉我什么会报错?
>明确说, 分析一个已经错误的方法其实某种意义上浪费时间, 中国教育的典型错误。
...



明确告诉你, 段错误是OS给出的信号.

你应该把你的着眼点放大. 只在一个小范围里, 是得不到正确结果的.

有些错误是没有意义的...何必要执着呢, 知识到了, 自然就明白了.

论坛徽章:
0
8 [报告]
发表于 2007-03-28 12:19 |只看该作者
原帖由 believetruelove 于 2007-3-28 11:32 发表
可能我的看法有点肤浅,觉得刚才自己提的问题并不一定非得在操作系统的层面给我解答,我只需要从语言角度告诉我什么会报错?
>明确说, 分析一个已经错误的方法其实某种意义上浪费时间, 中国教育的典型错误。
...


你认为你是缺少什么知识,才需要别人的指导,就这个段错误问题,

论坛徽章:
0
9 [报告]
发表于 2007-03-28 12:30 |只看该作者
原帖由 believetruelove 于 2007-3-28 11:32 发表
可能我的看法有点肤浅,觉得刚才自己提的问题并不一定非得在操作系统的层面给我解答,我只需要从语言角度告诉我什么会报错?
>明确说, 分析一个已经错误的方法其实某种意义上浪费时间, 中国教育的典型错误。
...


符合标准的C实现只对你保证,写一个未初始化的指针导致的行为是"未定义"的.C里面没有段错误这个概念(不知道最新的标准有没有),即使是信号,它也没有规定是该用什么信号. 简单的例子就是"你有种骂我试试",结果是未定义的一样,通常别人会以常见的手段对付你,但是可能发生任何事情.

所以你去更改一个指针可能会程序崩溃,系统报错,系统崩溃,死机,
这些都是可能的.

我帮你总结一下,如果非要答案
三个字,'未定义'

论坛徽章:
0
10 [报告]
发表于 2007-03-28 12:45 |只看该作者
原帖由 flw2 于 2007-3-28 12:30 发表


符合标准的C实现只对你保证,写一个未初始化的指针导致的行为是"未定义"的.C里面没有段错误这个概念(不知道最新的标准有没有),即使是信号,它也没有规定是该用什么信号. 简单的例子就是"你有种骂 ...



一直想看看C标准...可惜那个英文读起来好难理解...自己英语太差了>_<
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP