segmentation fault
2012-12-12 20:12
92 查看
今天写的全排列算法使用gdb运行时出现了段地址错误:segmentation falut.
1. 第一个位置是strlen调用的地方,这是由于我传递给strlen函数的char*类型的指针是从main函数的argv[1],而我运行程序的时候忘记了传递参数给main函数。所以使用argv的时候,数组下标已经越界访问,不仅如此,strlen的参数是一个局部指针变量,此时由于没有初始化,指向的是一个随机的地址,所以当strlen函数体访问该指针指向的地址时访问到了不该访问的空间,所以出现段错误。
2. 第二个段错误也是指针指向了非法的区域。在写递归调用的时候,由于每次传递进去的指针都是不一样的,我错误地每次都传递了相同的指针,不仅如此,我计算的指针偏移量也是有问题的,最后终于还是改正过来了。
注意到一个问题:程序员自己分配的空间的问题。
在写函数的时候,如果希望传递一个地址给一个函数,令其将返回的东西填进这个地址中,那么究竟是应该先开辟一个空间,然后传递给函数处理还是传递一个指针的地址给函数,责令函数在内部开辟空间自己访问?据我的观察,貌似前者的写法才是比较规范的。Linux下有很多这样的代码都是尽量避免使用内存中堆区的空间,基本都是在栈区来处理所有问题的。可能设计人员都写好了,规定栈区有多大,每个模块能够使用多大的空间的吧。于是在linux下的代码中会看到很多的取地址运算符,这些运算符作用一些栈区的变量然后传递给函数来访问。以后都尽量这样写吧。在C语言中不要随便开辟空间。
另外一个问题:何时使用全局变量?
这个问题也很困扰我。在Java语言中就不会存在全局变量这种问题,因为它不存在。原则上来说,像面向对象一样,仅仅使用局部变量和访问这些变量的接口就可以完成程序的设计,即模块之间是使用消息来协同运算的。C也可以完全按照这种思想来写东西,所有东西都写成封装的东西,然后通过函数传递参数来完成程序设计,约莫估计一下,我写过的程序,好像只有在写Flex及Bison的时候采用到了全局变量,其他时候我是用不到的。难道真的要抛弃全局变量吗?仔细想来,全局变量也仅仅是实现不同模块协同运算的一种方式,那为什么一定要用它呢,因为过程也可以完成同样的事情呢,过程本身就是全局标识符,是整个程序都可以看见的东西。
1. 第一个位置是strlen调用的地方,这是由于我传递给strlen函数的char*类型的指针是从main函数的argv[1],而我运行程序的时候忘记了传递参数给main函数。所以使用argv的时候,数组下标已经越界访问,不仅如此,strlen的参数是一个局部指针变量,此时由于没有初始化,指向的是一个随机的地址,所以当strlen函数体访问该指针指向的地址时访问到了不该访问的空间,所以出现段错误。
2. 第二个段错误也是指针指向了非法的区域。在写递归调用的时候,由于每次传递进去的指针都是不一样的,我错误地每次都传递了相同的指针,不仅如此,我计算的指针偏移量也是有问题的,最后终于还是改正过来了。
注意到一个问题:程序员自己分配的空间的问题。
在写函数的时候,如果希望传递一个地址给一个函数,令其将返回的东西填进这个地址中,那么究竟是应该先开辟一个空间,然后传递给函数处理还是传递一个指针的地址给函数,责令函数在内部开辟空间自己访问?据我的观察,貌似前者的写法才是比较规范的。Linux下有很多这样的代码都是尽量避免使用内存中堆区的空间,基本都是在栈区来处理所有问题的。可能设计人员都写好了,规定栈区有多大,每个模块能够使用多大的空间的吧。于是在linux下的代码中会看到很多的取地址运算符,这些运算符作用一些栈区的变量然后传递给函数来访问。以后都尽量这样写吧。在C语言中不要随便开辟空间。
另外一个问题:何时使用全局变量?
这个问题也很困扰我。在Java语言中就不会存在全局变量这种问题,因为它不存在。原则上来说,像面向对象一样,仅仅使用局部变量和访问这些变量的接口就可以完成程序的设计,即模块之间是使用消息来协同运算的。C也可以完全按照这种思想来写东西,所有东西都写成封装的东西,然后通过函数传递参数来完成程序设计,约莫估计一下,我写过的程序,好像只有在写Flex及Bison的时候采用到了全局变量,其他时候我是用不到的。难道真的要抛弃全局变量吗?仔细想来,全局变量也仅仅是实现不同模块协同运算的一种方式,那为什么一定要用它呢,因为过程也可以完成同样的事情呢,过程本身就是全局标识符,是整个程序都可以看见的东西。
相关文章推荐
- tar.gz文件安装方法
- 2.7节 这一节指针最有意义的题目
- C/C++中的段错误(Segmentation fault)[转]
- 一种Linux中快速定位段错误的方法
- python import cv2报错 segmentation fault:11
- linux环境下调试一些嵌入式设备时出现Aborted、segmentation fault、卡死的问题
- segmentation fault, 段错误简单定位步骤
- 捕捉信号SIGSEGV并回溯栈帧backtrace
- unix等系统出现断错误(Segmentation Fault)的总结
- Linux环境下段错误的产生原因及调试方法小结
- 移植tslib,测试电容屏
- Segmentation fault到底是何方妖孽
- 调试 Segmentation fault 问题
- segmentation fault 段错误解决方法
- [Segmentation Fault] Oops! The filename points to a constant string
- 期末临考小记。
- HDU 2716 水题
- [CFNews] Oxygen官方对于新版XRY与之冲突问题的官方解释
- 实用的监控内存插件
- Enabling vi syntax color