keil5 仿真 【51单片机 】闪退
如果在main函数外初始化赋值【定义写在外面没问题】,点击调试仿真就会闪退;但是把初始化赋值写在main函数外面build后hex文件烧录到单片机运行却没有问题,这是为什么
keil5 仿真 【51单片机 】闪退
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言这个问题可能是由于keil5编译器的一些特性导致的。在keil5中,当我们定义全局变量时,编译器会把它放在内存的静态存储区,而这个区域初始化时是以零值进行的。如果我们在定义全局变量时对它进行了赋值,编译器会把代码放在内存中的程序区域,并在main函数执行之前执行这些代码。 在调试仿真时,当我们尝试从静态存储区读取变量的值时,由于该区域中存储的值都是默认的零值,读取到的值可能会出现异常,从而导致程序出现错误。 解决这个问题的方法是在外部初始化全局变量时,将赋值操作放在函数内部,以确保执行顺序正确。 以下是一些可行的代码示例: 例1:
int myVar = 0;
int main()
{
myVar = 1;
//其他代码
}
这里,全局变量myVar在定义时赋值为0,然后在main函数中将其赋值为1。这种方法可能导致程序出现错误。 例2:
int myVar;
void init()
{
myVar = 1;
}
int main()
{
init();
//其他代码
}
这里,全局变量myVar被定义但未被初始化。然后,在init函数中将myVar赋值为1。在main函数中调用init函数以初始化myVar,然后执行其他代码。 通过这种方法,我们可以确保myVar的初始化发生在main函数执行之前,这可以确保myVar的值在程序正常执行期间是正确的。 注:如果您使用C++,则可以使用构造函数来解决这个问题。在这种情况下,全局变量myVar将自动初始化为零值,并在程序开始时使用构造函数进行初始化赋值。 例3:
class MyClass
{
public:
int myVar;
MyClass()
{
myVar = 1;
}
};
MyClass myObject;
int main()
{
myObject.myVar = 2;
//其他代码
}
这里,我们定义了一个包含一个整数成员变量的类MyClass。我们创建了一个全局对象myObject,在程序开始时使用MyClass构造函数初始化myVar。在main函数中,我们将myVar赋值为2,然后执行其他代码。