對於一些背景,我正在用C語言編寫一個讀表應用程序,用於運行DOS專有版本的小型16位掌上電腦。C指針問題 - 我在這裏做錯了什麼?
我有一個顯示儀表信息並提示用戶輸入讀數的屏幕。當用戶按下該單元上的輸入鍵,下面的代碼將執行:
/* ...
* beginning of switch block to check for keystrokes
* ...
*/
case KEY_ENTER: {
/* show what has been entered */
if(needNew == 0) {
/* calculate usage for new reading */
double usg = 0;
int ret = CalculateNewUsage(vlr, buf, &usg);
VerifyReadScreen(vlr, ret, buf, &usg);
needRedraw = TRUE;
}
break;
}
/* .... end switch statement */
vlr
是一個指針,它指向包含所有帳戶/米的信息的結構,buf
是用來存儲數值擊鍵char[21]
類型的在這個塊之上處理的讀數。當我在調用CalculateNewUsage
之前和之後檢查它們時,我的變量都包含有效數據。
但是,當我在輸入VerifyReadScreen
後再次檢查變量數據時,newread
指向內存中隨機的某處,並返回看起來像版權聲明的東西。有趣的是,無論帳號是什麼或讀入的是什麼 - 屏幕上都會顯示VerifyReadScreen
中newread
的相同無效數據。我以與CalculateNewUsage
相同的方式將地址傳遞到VerifyReadScreen
,但不知何故,我已經結束了一些不同的事情。
這裏是VerifyReadScreen
:
BYTE VerifyReadScreen(const VLRREC * vlr,
const int status,
const char * newread,
const double * usage) {
/* snip a whole bunch of irrelevant formatting code */
printf("%s", (*newread)); /* prints funky copyright text */
/* snip more irrelevant formatting code */
return TRUE;
}
謝謝Jefromi爲指出,在那裏我居然在VerifyReadScreen
打印newread
代碼真的應該閱讀:
printf("%s", newread); /* yay! */
,因爲我並不需要取消newread
,因爲printf
爲我做這個。我基本上是將一個指針傳給了一個指向內存中某個任意位置的指針。
如何聲明'buf'和'usg'? – 2010-03-05 17:59:45
當你說「'buf'是一個字符串」時,你的意思是它已經是'char *'了嗎?並且你正在投射它的地址來輸入'const char *'? – Cascabel 2010-03-05 18:00:25
@Alokzilla - buf的類型是char [21]',在檢查鍵擊的代碼的功能塊中聲明。 usg在'case KEY_ENTER'塊中聲明。 – 2010-03-05 18:06:00