C语言中报段错误(核心已转储)的常见问题
生活随笔
收集整理的這篇文章主要介紹了
C语言中报段错误(核心已转储)的常见问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在c語言指針的使用過程中,常常會見到段錯誤的情況,這是由于指針指向的內存空間存在問題引起的。
1.野指針
(指向一塊未知區域的指針,被稱為野指針,引用野指針,可能會破壞系統的關鍵數據,導致系統崩潰等嚴重后果)
#include <stdio.h>int main(int argc, char const *argv[]){int *p;//野指針,沒有指向一塊明確的地址空間*p = 100;//這里會出現段錯誤(內存錯誤)因為p時沒有指向地址空間的,系統會隨機分配一塊//對其賦值操作的話,就屬于非法訪問printf("%d\n", *p);return 0;}為了避免這種情況,我們要在定義的時候就要初始化指針變量。或者為其賦值為NULL
?
2.指針越界
指針越界這種情況,一般在數組中常見,指針指向的地址超出了數組所申請的內存空間,造成指針越界(屬于非法訪問)
?
3.指針所指向的內存,被系統回收
這種情況常見于指針函數,返回一個指針變量的時候發生。
解決:盡量不要讓返回的指針指向局部變量,局部數組和形式參數。
#include <stdio.h>int * test(int *arr); int main(int argc, char const *argv[]) {// 段錯誤演示int arr[10]={0,1,2,3,4,5,6,7,8,9};//調用函數int *p2=test(arr);return 0; }int * test(int *arr)//一般用int arr[]定義形參 {int arr1[10]={0};//初始化數組// 將數組倒敘輸出for (int i = 0; i < 10; ++i){arr1[10-i]=arr[i];}int *p=arr1;return p; } /* 1.在上面的代碼中,調用了一個返回值為函數的指針變量 2.函數調用后,會立即釋放局部變量,所以導致指針p指向的地址無效,導致段錯誤的發生 */注意:上面代碼的釋放局部變量,不是指的馬上銷毀這些空間里面的數據,而是指的放棄了對這塊空間的使用權限。
比如:
#include <stdio.h>int *func(){int n = 100;return &n; }int main(){int *p = func(), n;/*1.運行這個代碼發現照樣可以訪問到n的值2.這不和前面說的放棄了對數據的使用權相悖了嗎? 答:不是3.這里可以訪問到,完全是巧合,因為在后面的代碼中,沒有其他的再去申請這塊地址的使用權4.如果我們在 int *p = func(), n; 的后面加一句printf("cai_grass的博客");就會導致段錯誤。5.為什么:因為調用了printf()函數過后,會把后面的空間占據,導致p指針指向發生錯誤 */n = *p;printf("value = %d\n", n);return 0; }?
4.通過指針去定義數組后更改數據 ? 發生的段錯誤
#include <stdio.h>int main() {//定義一個字符數組 修改其中一個位置的值 運行結果正確char name1="caiqiang";name1[1]='M';//通過指針的方式定義然后再去修改 就會報段錯誤 // char *name="caiqiang";// name[1]='M';// *(name+1)='M'; //這和name[1]='M'都表示一樣的操作/*這是為什么吶?1.通過數組的方式,我們先合法的申請了一段地址空間來存儲數據 存儲的是變量2.指針定義的話 是直接指向了字符串常量 我們知道 常量是不可變的 所以不可更改 */return 0; }5.總結:
總結
以上是生活随笔為你收集整理的C语言中报段错误(核心已转储)的常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询linux信号量命令,Linux信号
- 下一篇: ICEM CFD简明教程