1、概念
当程序运行过程中,如果访问到了非法的内存空间,则系统会发出一个段错误的信号。每一个程序都会有一个静默的线程用来接受程序中发出的一切信号,根据接受信号的不同,该线程就会执行不同的操作。当接受到的是段错误信号时,则程序就会直接退出。
2、段错误发生的情况
- 访问到了空指针
示例:int *P=NULL; *P=5;
此时由于对空指针进行取值操作,相当于访问了空指针并试图修改空指针上的值,所以发生段错误。 - 访问到野指针 ——未初始化的指针,此时该指针会随意指向系统内存空间上任意一片地址。如果对野指针进行修改,可能修改到系统运行的关键内存。所以操作野指针非法。
示例:int *q; *q=15;
此时由于对一个未初始化的指针进行取值操作,相当于访问了一个随机的内存空间并试图修改空间上的值,所以发生段错误。 - 访问了常量指针
3、常量指针和指针常量的概念:
- 指针常量:代表该指针指向的空间不能改变,即该指针保存的值(一个地址)不能修改。
最典型的指针常量:数组名。 - 常量指针:代表该指针的指向可以随意改变,但是一旦被该指针指向后,被指向的内存空间上的值就变成了常量。即常量指针指向的内存空间上的值不能通过该指针改变。
常量指针另外一种形式:该指针是一个变通指针,但是它指向了一个真正意义的常量。最典型的代表:指向一个字符串的指针。
如何声明一个指针常量和一个常量指针
可以使用const直接修饰 - 如何区别理解常理指针和指针常量的声明方法:
const char*p:此时const修饰的是char * p这个指针,所以是常量指针。
char * const p:此时conse修饰的是变量p,一旦一个变量被const修饰后,就会转化成常量,所以这是一个指针常量。
注意:
常量指针,代表该指针指向的内存空间上的值,不能通过该指针进行修改。
指针常量,代表该指针不能修改指向。