你所说的在TC上运行正常,是否是以Debug模式编译的,下面这段代码在VS2005上测试。
问题出在 RxCounter 的类型上,RxCounter 为char 型,但scanf会将他认为是int型,
然后就内存越界了。
还有,printf("RxCounter = %d.",RxCounter); 在8位机中也有可能出错,原因一样,
不过是读越界。但32位机没有表现出异常,可能是传参方式造成的,没有仔细查看过。
IAR还挺强悍的啊,这样也报错,不错。
- #include "stdint.h"
- #include <stdio.h>
- void mputs(int len,void *pdat)
- {
- int i;
- unsigned char *sp = (unsigned char *)pdat;
- for(i=0; i<len; ){
- int tmp = *(sp+i);
- printf("%02X ",tmp);
-
- if(0 == (++i%8)){
- printf("\r\n");
- }
- }
- }
- int main(int argc, char *argv[])
- {
- char ch1 = 0x11;
- char ch2 = 0x12;
- char buff[4] = {0xA0,0xA1,0xA2,0xA3};
- struct {
- char ch1;
- char ch2;
- char buff[4];
- }mm = {
- 0x21,
- 0x22,
- 0xB0,0xB1,0xB2,0xB3
- };
- printf("\r\nroom ch1 @ 0x%08X : ",(unsigned long)&ch1);
- mputs(sizeof(int),&ch1);
- printf("\r\nroom ch2 @ 0x%08X : ",(unsigned long)&ch2);
- mputs(sizeof(int),&ch2);
- printf("\r\nroom buff @ 0x%08X : ",(unsigned long)&buff[0]);
- mputs(sizeof(int),&buff[0]);
- printf("\r\nroom mm @ 0x%08X : ",(unsigned long)&mm);
- mputs(sizeof(mm),&mm);
- printf("\r\n");
- // 输入字符到ch1,因为编译器在分配空间时有可能强制了地址对齐,所以有可能不会影响到ch2
- // PS VS2005中在Debug模式编译时,ch1的输入不会干扰ch2,编译器预留了变量监测空间,但在
- // Release模式编译时,ch1的输入干扰了ch2。
- printf("input char to ch1 : ");
- scanf("%d",&ch1);
- // 输入字符到mm.ch1,因为我们已经限定了mm.ch1及mm.ch2的分布,且均为char格式,符合编译器
- // 的对齐要求,mm.ch2将受mm.ch1输入的干扰而变化。
- printf("input char to mm.ch1 : ");
- scanf("%d",&mm.ch1);
- printf("\r\nroom ch1 @ 0x%08X : ",(unsigned long)&ch1);
- mputs(sizeof(int),&ch1);
- printf("\r\nroom ch2 @ 0x%08X : ",(unsigned long)&ch2);
- mputs(sizeof(int),&ch2);
- printf("\r\nroom buff @ 0x%08X : ",(unsigned long)&buff[0]);
- mputs(sizeof(int),&buff[0]);
- printf("\r\nroom mm @ 0x%08X : ",(unsigned long)&mm);
- mputs(sizeof(mm),&mm);
- printf("\r\n");
- getch();
- }
|