递归为什么不能用scanf("%d\n",&N);?

#include

void PrintN(int N);

int main()
{
int N = 0;
scanf("%d", &N);
PrintN(N);

return 0;

}

void PrintN(int N)
{
if (1)
{
PrintN(N - 1);
printf("%d\n", N);
}
return;
}
用VC的话是这样说的:
错误 1 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\kova\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\c.c 8 1 ConsoleApplication1
大意就是不太安全,在DEV C++ 上虽然能编译但是运行错误!
同样的scanf,同样的效果写成for的形式就能成功,这是为什么?

VS2013有安全机制:比如scanf strcpy 等都会限制,牵扯到内存溢出问题。。

VS2013有安全机制:比如scanf strcpy 等都会限制,牵扯到内存溢出问题。

因为可能导致内存溢!!

vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符.

带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高.

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节
char buf[5]={'\0'};
scanf("%s", buf);
如果输入1234567890,后面的部分会被写到别的空间上去