看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
james732:在 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)
LPH66:char setZero[] = {'0'}; 只會宣告出含一個元素的陣列 04/03 17:10
LPH66:所以 strcpy 可能存取到不該存取的記憶體 04/03 17:10
b2305911:所以...該如何處置?? 04/03 17:17
james732:strcpy(cur_ptr, "0"); 這是一種辦法,把setZero兩行拿掉 04/03 17:18
james732:像這樣 http://pastie.org/1750063 04/03 17:19
b2305911:終於過了 謝謝 04/03 17:20