全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2825
推到 Plurk!
推到 Facebook!

char指標問題

答題得分者是:rick060
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-14 22:23:43 IP:203.73.xxx.xxx 未訂閱
以下使用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 ch[i]=tmp[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 ch[i]=tmp[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 的結果不同?
請問我哪邊觀念有問題嗎?

謝謝指導
編輯記錄
GGL 重新編輯於 2009-07-14 22:24:12, 註解 無‧
GGL 重新編輯於 2009-07-14 22:25:03, 註解 無‧
GGL 重新編輯於 2009-07-14 22:25:30, 註解 無‧
GGL 重新編輯於 2009-07-25 15:03:49, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-28 20:37:23 IP:114.39.xxx.xxx 訂閱
第13 行??
for(int i=0;i//少了 1

應該是這樣吧?
for(int i=0;i
------
FPGA驗證, FPGA開發平台, http://smims.com
rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-17 13:58:30 IP:122.146.xxx.xxx 訂閱
從前以來 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-18 14:17:05 IP:59.125.xxx.xxx 訂閱
恩,這回復,很有啟發性,很棒
===================引 用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-11-26 12:59:15 IP:140.127.xxx.xxx 訂閱
tmp[strlen(ch) 1]='\0';

這個....恩...跟當初宣告的長度不一樣吧
------
恩...
系統時間:2024-04-18 13:17:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!