日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言中报段错误(核心已转储)的常见问题

發(fā)布時(shí)間:2023/12/31 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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é):

  • 指針定義時(shí),及時(shí)初始化
  • 絕不引用已被系統(tǒng)回收的內(nèi)存
  • 確認(rèn)所申請(qǐng)的內(nèi)存邊界,謹(jǐn)防越界
  • 總結(jié)

    以上是生活随笔為你收集整理的C语言中报段错误(核心已转储)的常见问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。