你所说的在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();
}
|