linux程式設計中遇到的Segmentation fault錯誤
昨天程式設計的時候,遇到了Segmentation fault錯誤。使用GDB除錯時才發現的,順便說下。習慣了圖形介面式的除錯工具,用命令列確實還是不習慣。關於此錯誤問了下谷歌,一搜一大篇,看來是一個很常見的問題。
簡單來講,這個錯誤就是因為非法訪問了系統中的記憶體而導致的錯誤,比如一些系統中關鍵記憶體區域。那我的錯誤是怎麼導致的呢?原來我在定義一個char型別的指標,然後就直接對這個指標進行字串的相關操作。比如:
char *c1;
for(i=0; i<n;i++)
{
*c1 = getchar();
c1++;
}
程式碼意思大概是這樣,後來想想才發現又煩了老毛病。這個指標危險啊,要謹慎對待,就拿這裡來說,你這樣給指標賦值,誰知道這指標指向的是哪裡呢,萬一寫的資料覆蓋了關鍵區域資料那可能會有災難性的後果,這就是訪問了不該訪問的地方。解決的辦法是什麼呢,告訴這個指標到該到的地方,我用malloc為該指標將要指向的字串申請一段空間,這樣就會指明系統分配一段安全的空間,不會在把記憶體關鍵區域分給你了。這樣你就可以安全操作了。
對於指標,不能掉以輕心了。
相關推薦
linux程式設計中遇到的Segmentation fault錯誤
昨天程式設計的時候,遇到了Segmentation fault錯誤。使用GDB除錯時才發現的,順便說下。習慣了圖形介面式的除錯工具,用命令列確實還是不習慣。關於此錯誤問了下谷歌,一搜一大篇,看來是一個
使用strace排查Segmentation fault錯誤
51cto 這也 文件內容 com 說明 middle col prim vpd 今天,DBA突然跟我說,有一臺測試機的sqlplus用不了,讓我幫忙看看什麽問題。 問題現象就是,執行sqlplus命令後直接報錯,登錄不了ORACLE數據庫: [oracle@epay-te
當linux系統中mysql 隨機密碼錯誤的處理方法
本人親測~~ 首先是要滿足我們產生的隨機密碼和我們實際輸入的隨機密碼是一致然後系統顯示密碼錯誤 因為我第一次修改所以沒有截圖 教程還是有的 異常,密碼錯誤,無法登陸!!! 重置root密碼 1、首先停止mysql服務程序: service mysqld stop
每天進步一點點——Linux程式設計中的檔案鎖之flock
無論程式以什麼模式打開了檔案(讀、寫或者讀寫),該檔案上都可以放置一把共享鎖或互斥鎖。在實際操作過程中,引數operation可以指定對應的值將共享鎖轉換成互斥鎖(反之亦然)。將一個共享鎖轉換成互斥鎖,如果另一個程序要獲取該檔案的共享鎖則會阻塞,除非operation引數指定了LOCK_NB標記,即:(LOC
Linux程式設計中的坑——C++中exit和return的區別
今天遇到一個坑,折騰了一天才把這個坑填上,情況是這樣的: 寫了段程式碼,在main()函式中建立一個分離執行緒,結果這個執行緒什麼都沒幹就直接掛掉了,程式碼長這樣: int main() { 建立一個分離執行緒(); return 0; } 後來研(bai)究(
yum Segmentation fault 錯誤解決
[email protected]:/var/run>yum install gcc*Configuration file /etc/yum/pluginconf.d/security.conf not foundUnable to find configur
Spyder (Ubuntu 18.04) Segmentation Fault錯誤解決方案
1、Ubuntu環境下,安裝了tensorflow,執行Spyder,出現Segmentation Fault錯誤2、原因查詢: 1)pyqt、qt都已經安裝; 2)pip install - U spyder,重新安裝,仍然報錯;3、環境描述 [email
mysql報Segmentation fault錯誤
問題現象如下 [[email protected] bin]# ./mysql -uroot -p Enter password: Welcome to the MySQL monitor
Linux下使用-static -lpthread靜態編譯出現段錯誤(Segmentation fault)
最近在看golang,感覺go的靜態編譯思想很不錯。於是準備把手頭的幾個專案靜態編譯一下,結果編譯的時候沒報任何警告及錯誤,一執行就報段錯誤(Segmentation fault)。gdb逐步除錯,發現問題出在std::thread那裡。仔細檢查了下所有語法,沒
Linux下的段錯誤(Segmentation fault)產生的原因及除錯方法
段錯誤 就是訪問了錯誤的記憶體段,一般是你沒有許可權,或者根本就不存在對應的實體記憶體,尤其常見的是訪問0地址. 一 般來說,段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間,通常這個值是由gdtr來儲存的是一個48位的暫存器, 前32位是儲存由它指
[轉]【已解決】Linux下出現Segmentation Fault(core dump)錯誤
最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的
Linux環境中MangoDB第一次啟動出現Segmentation fault異常
背景: 原本有一臺Linux機器A已經運行了某版本的MongoDB資料庫,為了保證版本一致,將該安裝包拉到新的Linux機器B上面部署。 情況: 執行./mongo命令時,出現這個異常: Segmentation fault 解決: 查詢網上資料,說的大多都是“
C++中Segmentation fault(Core Dump)錯誤處理
什麼是Core Dump? Core的意思是記憶體, Dump的意思是扔出來, 堆出來. 開發和使用Unix程式時, 有時程式莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程序號的檔案生成, 這個檔
Linux下除錯段錯誤的方法[Segmentation Fault]--GDB
4. 段錯誤的除錯方法 4.1 使用printf輸出資訊 這個是看似最簡單但往往很多情況下十分有效的除錯方式,也許可以說是程式設計師用的最多的除錯方式。簡單來說,就是在程式的重要程式碼附近加上像printf這類輸出資訊,這樣可以跟蹤並打印出段錯誤在程式碼中可能出現的位置。為了方便使用這種方法,可以使用
Linux環境下段錯誤(Segmentation fault)的產生原因及除錯方法小結
最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的段錯誤做個小結,
Linux Segmentation Fault 段錯誤 產生原因除錯方法
轉載至:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html http://blog.sina.com.cn/s/blog_69cc2f0b0100qgl
Linux 程式設計段錯誤(segmentation error)總結
最近一段時間在linux下用C做一些學習和開發,但是由於經驗不足,問題多多。而段錯誤就是讓我非常頭痛的一個問題。不過,目前寫一個一千行左右的程式碼,也很少出現段錯誤,或者是即使出現了,也很容易找出來,並且處理掉。 那什麼是段錯誤?段錯誤為什麼是個麻煩事?以及怎麼發現程
【已解決】Linux下出現Segmentation Fault(core dump)錯誤
今天被這個問題搞了半個小時,後來通過新增printf(...)語句的方法找到了錯誤原因,是因為在程式中錯誤的輸出一個為空的字串導致。。。 1. 段錯誤是什麼 一句話來說,段錯誤是指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪
Linux下的段錯誤(Segmentation fault)產生的原因及除錯方法(經典)
編譯執行效果如下: [email protected] test $ gcc -g -rdynamic f.c [email protected] test $ ./a.out GNU gdb 6.5 Copyright (C) 2006 Free Software Foundation,
C/C++中的段錯誤(Segmentation fault)
}3)其他其實大概的原因都是一樣的,就是段錯誤的定義。但是更多的容易出錯的地方就要自己不斷積累,不段發現,或者吸納前人已經積累的經驗,並且注意避免再次發生。例如:<1>定義了指標後記得初始化,在使用的時候記得判斷是否為NULL<2>在使用陣列的時候是否被初始化,陣列下標是否越界,陣列元