char指標問題 |
答題得分者是:rick060
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
以下使用Dev-C++編譯
[code cpp] //--------------------------------------------------------------------------- #include #include #pragma hdrstop using namespace std; //--------------------------------------------------------------------------- #pragma argsused void charInverse(char *ch) { cout<<"Original: "< char *tmp=new char[strlen(ch)]; for(int i=0;i *(tmp i)=ch[strlen(ch)-i-1]; } for(int i=0;i } int main(int argc, char* argv[]) { char p[]="howareyou12345"; charInverse(p); cout<<"Inverse= " << p << endl; system("PAUSE"); return 0; } //--------------------------------------------------------------------------- [/code] 同樣的code,貼到VC發生錯誤 於 0xcccccccc 的 Inverse.exe 中發生未處理的例外狀況: 0xC0000005: 讀取位置 0xcccccccc 時發生存取違規 將code改成下面的,使用VC編譯可以得到正確的結果 [code cpp] //--------------------------------------------------------------------------- #include #include #pragma hdrstop using namespace std; //--------------------------------------------------------------------------- #pragma argsused void charInverse(char *ch) { cout<<"Original: "< char *tmp=new char[strlen(ch)]; for(int i=0;i *(tmp i)=ch[strlen(ch)-i-1]; } tmp[strlen(ch) 1]='\0'; //多加這行 for(int i=0;i } int main(int argc, char* argv[]) { char p[]="howareyou12345"; charInverse(p); cout<<"Inverse= " << p << endl; system("PAUSE"); return 0; } //--------------------------------------------------------------------------- [/code] 但是,在視窗點選任意鍵本來會關閉,卻出現Run-Time Check Failure #2 - Stack around the variable 'p' was corrupted. 請問這是什麼原因,我只是在練習使用指標,不用回傳的方式更改原來的char p,卻出現這些怪問題,為什麼dev-c 跟vc 的結果不同? 請問我哪邊觀念有問題嗎? 謝謝指導 |
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
從前以來 C 對型別與記憶體存取檢查一向都不嚴格
這倒變成一些初學者寫程式也變得格格不入,這對以後 coding 的風格與習慣都有不良影響 甚至有不穩定程式的產出 但我覺得這是學習的好經驗 你真正要思考的,為何 VC會有例外發生 思考(一) 針對你的 code char p[]="howareyou12345"; char *tmp=new char[strlen(ch)]; strlen(p) 是14 沒錯,但是陣列 p 向系統要的記憶體大小,真的只有 14 嗎,sizeof(p) 又是多少?? 上opengroup 查 strlen有一個重點 http://www.opengroup.org/onlinepubs/000095399/functions/strlen.html The strlen() function shall compute the number of bytes in the string to which s points, not including the terminating null byte. 思考(二) 如果 char p[] 換成 char *p,sizeof(p) 得到的值管用嗎,又代表什麼 思考(三) 你的第二個程式 tmp[strlen(ch) 1]='\0'; 你改變了是什麼,為何又會產生例外?
編輯記錄
rick060 重新編輯於 2009-11-17 14:00:56, 註解 無‧
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
恩,這回復,很有啟發性,很棒
===================引 用 rick060 文 章=================== 從前以來 C 對型別與記憶體存取檢查一向都不嚴格 這倒變成一些初學者寫程式也變得格格不入,這對以後 coding 的風格與習慣都有不良影響 甚至有不穩定程式的產出 但我覺得這是學習的好經驗 你真正要思考的,為何 VC會有例外發生 思考(一) 針對你的 code charp[]="howareyou12345"; char*tmp=newchar[strlen(ch)]; strlen(p) 是14 沒錯,但是陣列 p 向系統要的記憶體大小,真的只有 14 嗎,sizeof(p) 又是多少?? 上opengroup 查 strlen有一個重點 http://www.opengroup.org/onlinepubs/000095399/functions/strlen.html The strlen() function shall compute the number of bytes in the string to which s points, not including the terminating null byte. 思考(二) 如果 charp[] 換成 char *p,sizeof(p) 得到的值管用嗎,又代表什麼 思考(三) 你的第二個程式 tmp[strlen(ch) 1]='\0'; 你改變了是什麼,為何又會產生例外? |
istillloving
高階會員 發表:33 回覆:182 積分:183 註冊:2008-10-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |