写点什么

C++ | bool 变量值在程序运行过程中自动篡改问题解决

  • 2022-10-18
    河北
  • 本文字数:1204 字

    阅读完需:约 1 分钟

C++ | bool变量值在程序运行过程中自动篡改问题解决

前两天遇到了一个错误,并且这个错误是由自己一手造成,而且编译器也无法鉴别的错误。所以说,让我调试起来真是费了很大的力气,只是改了一句代码居然好了!


开发环境:VS2017 + Qt5.14.2


一般来说,我们定义的变量只要不是自增的情况下, 编译器是不会偷偷摸摸的修改数据的,那么,为什么我会说 bool 值的变量在运行过程中会被自动篡改呢?


前提,在程序中所有对 bool 类型的变量赋值的地方我都有进行日志输出,但是运行过程中莫名其妙的被修改了?


大家有没有遇到过这样的问题呢?又是怎么解决呢?

有人说是 bool 值不如 BOOL 值安全,在程序中最好使用 BOOL 值。是真的这样吗?

bool 是占 1 个字节的变量,BOOL 是占 4 个字节的变量,可以理解成简化的 int 类型。

在某些情况下,我们的码代码技术不严谨时,确实 BOOL 会比 bool 值安全。这就是我今天要说的问题,在运行过程中被篡改。最终导致我的 bool 在运行被修改。

int m_nState[6] = {0};bool m_bOpen;
复制代码

看上述两个变量的定义。没有什么奇怪之分吧!


成员变量 1:声明了一个 int 类型的数组,大小为 6,并将其初始化为 0,且每个元素都为 0。

成员变量 2:声明了一个 bool 类型的变量,假设默认设置为 false


单纯的看两个变量是没有任何问题的,如果你得 C++学的很棒,那么在后面你是不会出现我刚刚上述说的问题。


如果你对 C++的概念不是很透彻,那么请继续往下看!


在程序运行过程中,我想要对数组中的数据清空,那么该如何操作呢?


是这种形式吗m_nState[6] = {0} 猛然间一看,也发现不出什么错误来,这时候其实是越界了,但是,我们的 VS 编译器是不会报出任何错误的,不信的话,大家可以尝试一下。


那么,编译器不报错,就真的没关系了吗?


NO! 我们在.h 中声明数组的时候,紧接着又声明了 bool 类型的变量,经过我们刚刚的m_nState[6] = {0}赋值操作,会直接让我们的 bool 值悄悄地发生变化。不信?没关系,大家尽情的尝试,分别在赋值之前跟赋值之后打出日志来查看!


本身我们在声明的时候,数组中的数据只能存放 0-5 之间,这里,你却来了个[6],那不越界就奇怪了!


越界后,为什么我们编译器是不会报错误呢?

在 int 类型数组后面紧跟着其他类型的变量的定义,当前变量越界后会直接篡改紧邻的变量类型。


bool 值占一个字节,此时,运行的过程中,编译器就会给我们将数据修改!是不是很神奇!


但是,我们换用了 BOOL 作为紧邻的变量,例如下面的写法

int m_nState[6] = {0};BOOL m_bOpen;
复制代码

此时,再进行越界处理时,不会影响 BOOL 值的变化。


这是为什么呢? BOOL 类型占了 4 个字节,实际上有效的是低字节,所以即使是越界,也不会改变实际的值,bool 类型就不一样了,只占了 1 个字节,越界后直接会被篡改。


那么我们该如何对数组类型的数据进行清空呢?

memset(m_nState, 0, 6);
复制代码

还需要注意一点的是,如果你得数组越界之后,此时你并没有检查出来时,只要是后面的变量有 bool 类型时,依旧会被篡改!


大家请记住这一点,不是 bool 不安全,而是我们的写法有些时候是不严谨了。


我是中国好公民 st,一名 C++开发程序媛~

发布于: 11 分钟前阅读数: 5
用户头像

书山有路勤为径,学海无涯苦作舟 2022-07-01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
C++ | bool变量值在程序运行过程中自动篡改问题解决_c++_中国好公民st_InfoQ写作社区