只是为了备份其他人已经说过的内容,当您写入某个无效或非法的内存位置时,您的程序很可能会导致分段错误。
为了看到这是因为更新了一些随机内存地址的内容而发生的,我将显示您的程序在 GDB 下运行。
[jrn@localhost SO]$ gcc -ggdb dumb.c
[jrn@localhost SO]$ gdb ./a.out
GNU gdb (GDB) CentOS (7.0.1-42.el5.centos)
Reading symbols from /home/jrn/source/SO/a.out...done.
(gdb) run
Starting program: /home/jrn/source/SO/a.out
Program received signal SIGSEGV, Segmentation fault.
0x08048399 in main () at dumb.c:9
9 *pointer = 0;
(gdb) list
4 {
5 int number = 0;
6 int *pointer = &number;
7 while (1) {
8 pointer++;
9 *pointer = 0;
10 }
11 return 0;
12 }
13
您将在第 9 行看到错误发生在您写入某个不应该写入的内存地址时。操作系统使用通常由 CPU 提供的内存保护来检测错误写入。