static的妙用
- [1. 前言](#1. 前言)
- [2. 问题](#2. 问题)
- [3. 代码](#3. 代码)
- [4. 原因](#4. 原因)
- [5. 解决方法](#5. 解决方法)
1. 前言
今天跟大家分享一个代码调试的问题.
2. 问题
初始化结构体成员后,并没有执行相应操作
3. 代码
最终在写结构体与指针的代码中发现一个问题,简化的代码如下:
c
# include <stdio.h>
MSG_struct p_s1; //体定义p_s1结构体,实际部分省略
void handle()
{
if(cmd == 0x0)
{
...
}
else if(cmd1 == 0x1)
{
if(p_s1.a == 0xA)
encrypt(arg1,arg2,arg3);//函数
}
else if(cmd2 == 0x2)
{
p_s1.a == 0xA;//初始化a成员变量为0xA
}
}
int main()
{
cmd2=2;
cmd1=1;
handle();
return 0;
}
debug的时候发现分支2的加密函数居然没有触发,我十分好奇这是什么原因,按理说先让a等于0xA,然后进入到分支cmd1==0x1执行加密函数,但实际并没有进入if语句中。
于是我搜索了一番资料,找到了原因:
4. 原因
p_s1 是函数内局部结构体, 分支2对它的赋值只在当前函数栈内有效,进入分支1时局部变量已销毁 / 重置,导致读取不到赋值。
5. 解决方法
在结构体前面加一个static修饰符,把函数内的 p_s1 定义为 static(静态局部变量),生命周期和程序一致,赋值后不会丢失,且无需改其他逻辑:
c
static MSG_struct p_s1;
最后也是成功解决了这个问题,ByeBye~~