|
看《感悟设计》 第17、“由数组非法操作想到的” 其中一段程序:
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个字节,因此造成数组越界,引起程序死机。好不容易查到问题所在,修正char string[50]; 后,问题解决。(可以算出,该字符串大概需要35字节。)
我的疑问,printf(*str)语句可以直接输出字符串,为何作者在这里却要经过一个中间步骤?例:
strcpy(string,“高压危险”);
printf(string);
先把code区的字符串常量"高压危险"拷贝到data区数组string[ ]内,然后printf(string);
多此一举呀?谁能帮俺解释这种高手写的程序,毕竟作者是研发主管,干了十多年开发工作,又是写在书上教导咱菜鸟的程序。实在一头雾水。
这段程序的编译结果大致为:
linking...
Program Size: data=80.1 xdata=0 code=1418
"test" - 0 Error(s), 0 Warning(s).
?STACK=68H(=104) 堆栈指针在程序初始就高到了104,还有多少字节好用?
那如果要求输出的字符串更长的话,按照作者程序概念,是不是我要定义char string[100]; 或者更长? |
|