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