c语言%n运行错误

在格式化控制符中,有一种鲜为人知的控制符%n。这个控制符用于把当前输出的所有数据的长度写回一个变量中去,下面这段代码展示了这种用法。

#include<stdio.h>

int main(int argc, char const *argv[])
{
    int length=0;
    printf("hello%n\n",&length);
    printf("%d\n",length);
    return 0;
}

//编译环境:gcc
//测试环境:Linux mint
//
//输出:
//hello
//5

但是这个控制符很早以前就被Windows弃用了,VS2005 中在编译级别对参数做了更好的检查,而且默认情况下关闭了对“%n”控制符的使用,所以运行是会出现“Unhandled exception at 0x........ (ucrtbased.dll) in test.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.”,但是在vc6.0++和Linux上依然可以使用。

那么为什么要弃用控制符%n呢?

原因是%n可能会造成溢出漏洞,从而使进程被恶意代码劫持。