C语言——神奇的static

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~~

相关推荐
平头哥技术团队6 分钟前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
pnoker6 分钟前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++6 分钟前
【洛谷】kmp算法
开发语言·算法
my_realmy7 分钟前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
传奇开心果编程21 分钟前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_3807438740 分钟前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
天远数科41 分钟前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
Draw Stars1 小时前
Git BASH安装教程
开发语言·git·bash
vortex51 小时前
一文讲透 Zsh 与 Bash 的区别
开发语言·bash
千谦阙听1 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习