野指针引发的段错误(附解决方法)
来源:互联网 发布:淘宝传奇一条龙靠谱吗 编辑:程序博客网 时间:2024/05/21 11:25
写了一个静态栈的程序,但是在不同的调用中,出现的结果完全不一样。
编译器是,操作系统是Ubuntu9.04,CPU是AMD4400,但是装的是32位的操作系统。
$ gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
下面是静态栈的源程序:
下面的源代码test.c用
$gcc link_stack.c test.c
编译正确,但是加上-O1 -O2或者-O3时就会出现运行时的段错误
下面的源代码convert.c用
$gcc link_stack.c convert.c
编译时就会出现段错误,加上-O1 -O2或者-O3时也会出现运行时的段错误
对于convert.c这个函数。
就算在main函数中初始化stack* p = NULL,然后调用stack_init(p),也会出段错误。
问题看来是stack_init函数不能正确执行,具体原因还弄不清楚。
对于段错误来说,通常 是由于读写了不访读写的内存地址。
实际上,在convert.c和test.c的main函数中,stack* p的写法有问题,因为这个指针属于野指针,没有一个内存区域。
应写成
stack m, *p;
p = &m;
这也是涉及的指针的所有程序书写时必须注意的一点,不能上来就直接定义一个指针,必须确保这个指针指向一个数据类型 。
一重指针
int a, *p;
p = &a;
两重指针
int a, *p, **q;
p = &a;
q = &p;
第二条语句*p =a 连接着q与a,如果去掉,中间就会断链,出现野指针。
后面的stack_init 的p->base才有一个空间供它存malloc的首地址,如果不声名stack m; p->base就不知道存什么位置,
最后理所当然的是段错误了。
后面补充一点,如果你在一个自定义函数里使用malloc,然后拿到main函数里去调用,不出错的方法有两种:
1. 入口参数用两重指针,指向你想保存内存起始地址的一个指针变量。
2. 把malloc的内存起始地址做为返回值。
这两种方法也是C语言的函数参数传递的两种方法。如果不用这两种中的一种,那么自定义函数调用结束之后,malloc的空
间会被收回。到最后会出现段错误。
- 野指针引发的段错误(附解决方法)
- strcmp段错误引发的思考
- 野指针和段错误
- 关于释放指针引发的一个错误
- 调用ODBC中SQLBindParameter引发的段错误
- 一个指针引起的段错误
- 指针 段溢出 段错误的自我学习
- linux下oracle删除表空间引发错误的解决方法
- 添加程序集之后引发CS0234错误的解决方法
- 指针引发的探究
- 指针使用产生段错误
- 指针 段错误 segament fault
- 指针 段错误 segament fault
- 指针 段错误 segament fault
- 二级指针及段错误
- C语言指针段错误
- 用malloc引发的段错误---malloc 与 calloc的区别
- linux 编译段错误解决方法
- english practice No.8
- Forward [To: Android Beginners ]
- oracle 数据库 基础
- Google日历的功能
- 算法与追mm
- 野指针引发的段错误(附解决方法)
- 可以做non-type tamplate argument 的类型
- hudson的安装(windows下以及linux下)
- 嘻游记 QVOD快播高清电影在线播放下载
- 自动挂载Windows分区
- PHPCMS2008源码浅析-cache.func.php PHPCMS20008二次开发
- (转)现代图像处理与分析
- 格式化字符串操作
- Oracle: ORA-01000: 超出打开游标的最大数问题及解决办法