为什么该异常声明“运行时检查失败#2 - 堆栈变量'f'被损坏。”扔在这里?
问题描述:
我写了这个代码:为什么该异常声明“运行时检查失败#2 - 堆栈变量'f'被损坏。”扔在这里?
void f1(void)
{
sprintf("\nf1.");
}
void f2(void)
{
sprintf("\nf2.");
}
void f3(void)
{
sprintf("\nf3.");
}
void f4(void)
{
sprintf("\nf4.");
}
int main()
{
// int i;
void (*f[4])(void);
f[1]=f1;
f[2]=f2;
f[3]=f3;
f[4]=f4;
(*f[1])();
(*f[2])();
(*f[3])();
(*f[4])();
/*for(i=0;i<4;i++)
{
(*f[i])();
}*/
getch();
}
程序编译,运行和显示输出
f1.
f2.
f3.
f4.
但是当我按下回车键,抛出异常,指出“运行时检查失败# 2 - 围绕变量'f'的堆栈已损坏。“
请向我解释原因,以及何时使用snprintf和sprintf。 另外,让我知道为什么我不能使用
for(i=0;i<4;i++)
{
(*f[i])();
}
函数指针。这也是一个错误。
答
void (*f[4])(void);
f[4]=f4;
从C开始的数组访问f[4]
是非法的。因为你使用的sprintf
功能
#include <stdio.h>
:
答
除了你越界数组问题,你必须有此行。如果你这样做,你的编译器会给你一个错误,说你错误地调用了它。您的编译器可能已经警告过您使用了隐式声明。就目前而言,它会继续前进,错误地调用功能并希望获得最佳效果。这也可能导致堆栈问题。
备注:'sprintf'做的事情完全不同于你想象的。你想使用'printf'。另见http://en.cppreference.com/w/c/io/fprintf – Zeta 2013-03-07 21:05:14