某個類a下面若干個cstring成員
a.str1
a.str2
a.str3
...
...
...
然后這些成員的值會在某個函式bbb()里被改變
比如變成
a.str1 = "1號"
a.str2 = "2號"
a.str3 = "3號"
...
...
...
然而,當這個bbb()執行完畢并回傳上一層呼叫函式后(注意跟蹤到bbb的return前,這些值都還正常的),這些值統統前移一位變成了
a.str1 = "2號"
a.str2 = "3號"
a.str3 = "4號"
...
...
...
a.strn = "口"
最后一個a.strn本來應該是"n號“,卻變成一個”口“字一樣的亂碼
請問什么原因,該怎么解決?
uj5u.com熱心網友回復:
得看代碼才行uj5u.com熱心網友回復:
代碼放出來,沒有代碼就智能瞎想uj5u.com熱心網友回復:
跟蹤一下,看是哪里在修改字串的值uj5u.com熱心網友回復:
是不是有其他地方破壞了資料uj5u.com熱心網友回復:
回傳之前,設定資料斷點 除錯運行uj5u.com熱心網友回復:
僅供參考:#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本來是b[10],為判斷哪句越界,故意宣告為b[11]
srand((unsigned int)time(NULL));//按兩次F11,等黃色右箭頭指向本行時,除錯、新建斷點、新建資料斷點,地址:&b[10],位元組計數:4,確定。
while (1) {//按F5,會停在下面某句,此時a的值為10,b[10]已經被修改為對應0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}
uj5u.com熱心網友回復:
建議一步步除錯,看是什么原因導致前移uj5u.com熱心網友回復:
單步調,肯定是程式有問題,CString 這么用沒毛病uj5u.com熱心網友回復:
看不到代碼都是扯淡
uj5u.com熱心網友回復:
函式bbb的引數是類a嗎?還是其他類強轉的??uj5u.com熱心網友回復:
QQ我
uj5u.com熱心網友回復:
斷點除錯,不可能是編碼問題,CString這樣用沒錯uj5u.com熱心網友回復:
除錯資料值莫名其妙改變這類問題,請使用#7推薦的使用資料斷點法。
uj5u.com熱心網友回復:
這玩應單步查吧,肯定是代碼寫的問題。uj5u.com熱心網友回復:
估計程式哪里的高級錯誤
uj5u.com熱心網友回復:
好神奇的問題。uj5u.com熱心網友回復:
1 你可能有過時的pdb檔案,造成除錯顯示錯誤(前提是程式運行結果正常)2 bbb里面有損壞ebp,造成回傳地址錯誤。第一步應該在編譯引數里加/GS編譯然后加#pragma strict_gs_check(on) 。一些靜態代碼分析工具也可以幫助你找出問題(例如Visual C++的編譯選項/analyze )。
uj5u.com熱心網友回復:
考慮一個簡單方法試一試:把本專案的臨時檔案等清除,然后完整重新編譯一遍程式再運行看看uj5u.com熱心網友回復:
存盤器溢位??
uj5u.com熱心網友回復:
總該是bbb把字串改掉了uj5u.com熱心網友回復:
首先根據你提供的a.str1 = "2號"
a.str2 = "3號"
a.str3 = "4號"
...
...
...
a.strn = "口"
前移來看應該是你在資料操作的時候類似于陣列中下標從0開始,你卻從1開始操作,最后一個資料是“口”是你越界操作讀取到的資料
uj5u.com熱心網友回復:
str1 str2 str3之間有什么關系么?uj5u.com熱心網友回復:
慢慢單步執行debug吧uj5u.com熱心網友回復:
明顯是代碼問題,要debug除錯。uj5u.com熱心網友回復:
一般有亂碼,都是因為字串后沒有終止符,比如0或nulluj5u.com熱心網友回復:
uj5u.com熱心網友回復:
bbbb函式回傳前正常,回傳后值改變,最好在debug檢查時看看記憶體變化轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/61013.html
標籤:基礎類
上一篇:c++mfc例子
