C语言static局部变量值修改及printf输出异常咨询
对static修饰局部变量的认知误区澄清
很多初学者容易把static修饰词的“静态”语义误解为“变量值固定不可修改”,这是完全的概念偏差:
static修饰局部变量的实际作用仅三点:- 把变量的存储位置从栈区移到全局静态存储区
- 把变量的生命周期从“函数执行期间”延长到“整个程序运行全程”
- 变量的初始化仅在程序启动阶段执行1次,不会每次进入作用域都重新赋值
- 没有任何规则禁止修改这类变量的值。如果要让变量只读,必须搭配
const关键字实现。
你代码中b = b - 1;是完全合法的赋值操作,会直接覆盖静态存储区中b的实际值,后续printf读取这个修改后的值输出1,是完全符合C语言规则的正常结果,不存在和static特性冲突的情况。
第三个printf的异常输出属于参数错误的预期结果
你写的第三个printf调用存在明显的参数结构错误,其输出无意义值是这类错误的必然表现:
- 错误的调用逻辑拆解
printf("%d \n","%d",a,b);printf的执行规则是:将第一个参数作为格式控制字符串,根据串中的%d等占位符数量,从后续的入参列表中按顺序取值填充:- 本次调用的格式串
"%d \n"中仅包含1个整型占位符 - 紧跟在格式串后面的第一个入参,是字符串字面量
"%d"的首地址(指针类型),a、b两个整型值排在这个指针之后 - 因此printf会直接把这个字符串指针按
%d的格式转为整型输出,排在后面的a、b根本不会被函数读取。
- 本次调用的格式串
- 你看到的输出
4210693,本质是当前编译环境下,字符串字面量"%d"在内存中的实际地址值——因为用整型格式输出指针,这个地址对程序逻辑没有实际语义,看起来就是无意义的异常值。 - C语言对可变参数的类型、数量匹配性没有运行时强制校验,这类参数错位的写法属于典型的未定义行为:不同编译环境下,可能输出不同的地址值、乱码,甚至触发程序崩溃,所有非预期的运行结果,都是这类参数错误的合理后果,不存在“不该出现异常值”的特殊情况。
内容的提问来源于stack exchange,提问作者user134613
相关产品推荐
相关产品推荐

