段错误是指访问的内存超过了系统给程序分配的内存空间。一旦一个程序发生了越界访问,就会产生相应的保护,于是segmentation fault就发生了。
产生原因:
- 访问不存在的内存空间
没有申请空间就直接拷贝数据:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *ptr = NULL;
strncpy(ptr, "abc", 3); //没有申请空间直接使用
//正确的:
//ptr = (char *)malloc(sizeof(char) * 10);
//memset(ptr, 0, 10);
//strncpy(ptr, "abc", 3);
return 0;
}
- 访问只读的内存空间
往字符串常量空间拷贝新的数据
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *ptr = "test";
strcpy(ptr , "TEST");
return 0;
}
- 访问系统保护的内存空间
#include <stdio.h>
int main(int argc, char **argv)
{
int *ptr = (int *)0;
*ptr = 100;
return 0;
}
- 栈溢出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
main(argc, argv);
}