最近调试Keil C时发现了一个问题,写了个程序重新测试了一下:
//-------------------------- main.c -----------------------------
#include "test1.h"
#include "var.h"
void main()
{
int a;
global_int1 = 0;
var[0].int_member = 1;
a = global_int1;
}
//-------------------------- test1.c -----------------------------
#include "test1.h"
int global_int1;
struct struct_type var[2];
//-------------------------- test1.h -----------------------------
extern int global_int1;
extern struct struct_type var[2];
//-------------------------- var.h -------------------------------
struct struct_type
{
int int_member;
char char_member;
};
以上为测试程序,编译结果一点错误都没有,运行结果理论上a应该为0,而仿真的结果是a为1.为什么为这样呢?看看m51文件就清楚了。
------- MODULE TEST1
C:0000H SYMBOL _ICE_DUMMY_
D:0008H PUBLIC var
D:0008H PUBLIC global_int1
------- ENDMOD TEST1
原来变量var和global_int1的地址重叠了。
1.如果不是自定义的结构体类型,而是其他已知类型(如int),则内存不会覆盖。
2.如果不是结构体数组,仅仅是结构体变量,仍然会出错,不过编译会弹出警告:“TEST1.C(4): warning C230: 'var': uses undefined struct/union tag 'struct_type'”。为什么数组就不弹出警告呢?不知这算不算是一个bug。
阅读(2392) | 评论(0) | 转发(0) |