c++ 段错误(核心已转储)

一、什么是段错误?

段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。

二、段错误产生的原因

1、访问不存在的内存地址

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    int *ptr = NULL;
    *ptr = 0;
    return 0;
}

2、访问系统保护的内存地址

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    int *ptr = (int *)0;
    *ptr = 100;
    return 0;
}

3、访问只读的内存地址

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    char *ptr = "test";    
    strcpy (ptr, "TEST");
    return 0;
}

4、空指针废弃

因为是一个很常见的程序错误空指针废弃(读或写在一个空指针,用于C的意思是“没有对象指针”作为一个错误指示器), 大多数操作系统内存访问空指针的地址,这样它会导致段错误。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    int *ptr = NULL;
    printf("%d\n", *ptr);
    return 0;
}

非关联化一个空指针,然后分配(写一个值到一个不存在的目标)也通常会导致段错误。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    int *ptr = NULL;
    *ptr = 1;
    return 0;
}

下面的代码包含一个空指针,但当编译通常不会导致段错误,值是未使用的。因此,废弃通常会被优化掉,死代码消除。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    int *ptr = NULL;
    *ptr;
    return 0;
}

还有,比如malloc 动态分配内存,释放、置空完成后,不可再使用该指针。

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    char* str = (char*)malloc(100);
    if(*str)
    {
        return ;
    }
    strcpy(str,"hello");
    printf("%s\n",str);
    free(str);
    str=NULL;
    strcpy(str,"abcdef");
    return 0;
}

5、堆栈溢出

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    main();
    return 0;
}

6、内存越界(数组越界,变量类型不一致等)

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
 
int main()
{
    char test[10];
    printf("%c\n", test[10000000]);
    return 0;
}

 

posted @ 2023-07-13 19:54  韓さん  阅读(1152)  评论(0编辑  收藏  举报