Re: [問題] Segmentation fault

看板C_and_CPP作者 (Howard)時間13年前 (2011/04/03 17:05), 編輯推噓1(105)
留言6則, 3人參與, 最新討論串2/3 (看更多)
※ 引述《b2305911 (Howard)》之銘言: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux(編譯器不知道) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 寫大數運算 目前只做到資料的input和output 尚未寫好運算 作業要求將所有運算時需要的function都放在class裡 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): Segmentation fault 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> #include <cstdlib> #include <cstring> using namespace std; class BigNum { public: //constructor BigNum() { cur_ptr=new char[100]; in_ptr=new char[100]; } //add void Add(const char* ch) { } //functional void set(const char* ch) { if(strlen(ch)>100) { delete cur_ptr; cur_ptr=new char[2*strlen(ch)]; cur_ptr=strcpy(cur_ptr,ch); } else { strcpy(cur_ptr,ch); } } void set() { delete cur_ptr; cur_ptr=new char[2];//改過之後的 char setZero[]={'0'}; strcpy(cur_ptr,setZero); } char* show() { return cur_ptr; } //destructor ~BigNum() { delete cur_ptr; delete in_ptr; } private: char *cur_ptr,*in_ptr; int *a_ptr,*b_ptr,*c_ptr; }; int main(void) { BigNum X; X.set("96325874123654"); cout << X.show() << endl; X.set(); cout << X.show() << endl; return 0; } 補充說明(Supplement): 改過之後linux上可以編譯了 但最後output出來 0的後面會多一個問號 總覺得怪怪的 請問是哪裡還有問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.92.21

04/03 16:36,
在 void set(),改成 delete cur_ptr; cur_ptr = NULL;
04/03 16:36
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.92.21 ※ 編輯: b2305911 來自: 140.113.92.21 (04/03 17:10)

04/03 17:10, , 1F
char setZero[] = {'0'}; 只會宣告出含一個元素的陣列
04/03 17:10, 1F

04/03 17:10, , 2F
所以 strcpy 可能存取到不該存取的記憶體
04/03 17:10, 2F

04/03 17:17, , 3F
所以...該如何處置??
04/03 17:17, 3F

04/03 17:18, , 4F
strcpy(cur_ptr, "0"); 這是一種辦法,把setZero兩行拿掉
04/03 17:18, 4F

04/03 17:19, , 5F
04/03 17:19, 5F

04/03 17:20, , 6F
終於過了 謝謝
04/03 17:20, 6F
文章代碼(AID): #1Dc3XYyu (C_and_CPP)
文章代碼(AID): #1Dc3XYyu (C_and_CPP)