在今天的编程时,又出现了常见的段错误。
一:段错误
所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gd tr来保存的,它是一个48位的寄存器,其中的32位是保存由它指向的 gdt表,后13位保存 相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向 的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起 始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
1. 段错误的常见形式:1)访问系统数据区(或错误地址,非法地址),尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址。
2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。
2.解决方法:(详解见百度)
利用gdb逐步查找段错误
分析Core文件
利用backtrace和objdump进行分析
二:在编写程序时,还遇到一些模糊的问题:
(1)--a与a--。前者是自减后运算,后者是先运算后自减。
(2)void的用途。
摘:
1.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
2.void的使用
下面给出void关键字的使用规则:
规则一:如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型
我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。
规则二:如果函数无参数,那么应声明其参数为void
规则三:小心使用void指针类型
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作
规则四:如果函数的参数可以是任意类型指针,那么应声明其参数为void
规则五:void不能代表一个真实的变量
void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
2.void的使用
下面给出void关键字的使用规则:
规则一:如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型
我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。
规则二:如果函数无参数,那么应声明其参数为void
规则三:小心使用void指针类型
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作
规则四:如果函数的参数可以是任意类型指针,那么应声明其参数为void
规则五:void不能代表一个真实的变量
void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。