|
看《感悟設計》 第17、“由數(shù)組非法操作想到的” 其中一段程序:
void print_string(int str_ID)
{
char string[10]; //修正后 char string[50];
switch(str_ID)
{
case 0: strcpy(string,“高壓危險”);
break;
case 1: strcpy(string,“安全電壓”);
break;
case 2: strcpy(string,“請切換到備用電池,然后給主電池充電”); //這里在原本定義 char string[10]; 時越界,修改為 char string[50]; 后問題解決。
break;
}
printf(string);
}
作者想要說明的是語句 case 2: strcpy(string,“請切換到備用電池,然后給主電池充電”); 由于string[ ]只定義了10個字節(jié),因此造成數(shù)組越界,引起程序死機。好不容易查到問題所在,修正char string[50]; 后,問題解決。(可以算出,該字符串大概需要35字節(jié)。)
我的疑問,printf(*str)語句可以直接輸出字符串,為何作者在這里卻要經過一個中間步驟?例:
strcpy(string,“高壓危險”);
printf(string);
先把code區(qū)的字符串常量"高壓危險"拷貝到data區(qū)數(shù)組string[ ]內,然后printf(string);
多此一舉呀?誰能幫俺解釋這種高手寫的程序,畢竟作者是研發(fā)主管,干了十多年開發(fā)工作,又是寫在書上教導咱菜鳥的程序。實在一頭霧水。
這段程序的編譯結果大致為:
linking...
Program Size: data=80.1 xdata=0 code=1418
"test" - 0 Error(s), 0 Warning(s).
?STACK=68H(=104) 堆棧指針在程序初始就高到了104,還有多少字節(jié)好用?
那如果要求輸出的字符串更長的話,按照作者程序概念,是不是我要定義char string[100]; 或者更長? |
|