您的位置:首页 > 其它

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的时候采用到了全局变量,其他时候我是用不到的。难道真的要抛弃全局变量吗?仔细想来,全局变量也仅仅是实现不同模块协同运算的一种方式,那为什么一定要用它呢,因为过程也可以完成同样的事情呢,过程本身就是全局标识符,是整个程序都可以看见的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  segmentation fault