- 论坛徽章:
- 0
|
自己在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最大的不同何在?
希望得到大家的帮助,先谢谢了! |
|