相信大多数在vc下的程序员不会对segmentation error太熟悉,因为vc下并没有给出具体的错误信息,只是在运行中给出提示框“程序.exe遇到问题需要关闭”。而且在编译过程中也没有给出任何的error和warning,相信vc在这方面稍微要薄弱一点。
庆幸在gcc则会给出具体的segmentation error。
其实通常的段错误都是由于解除引用一个未初始化或非法值的指针引起的。
下面是一段示例程序,将帮助你理解:
#include "stdio.h"
int main(int argc, char* argv[])
{
printf("Hello World!/n");
//session 1:解除引用一个未初始化或非法值的指针
//试图往一个非法值的指针所指向的内存赋值
int *p = NULL;
*p = 16;
//conclusion: 段错误通常是由于解除引用一个未初始化或非法值的指针引起的
//很遗憾VC中并没有给出error或者warning,即使在运行中也没有给出明确的问题所在
//只是提示程序.exe遇到问题需要关闭,相信这并没有给出太多有用的信息
//值得庆幸的是,gcc中会给出segmentation error(core dump)
//相信你得感谢它将你从地狱拉回天堂
//一个更微妙的是,假如未初始化的指针恰好具有未对齐的值(对于指针所要访问的数据而言)
//它将会产生总线错误。对于绝对大多数计算机而言确实如此,因为CPU总是先看到地址,
//然后再把它发给MMU。
return 0;
}