1

我写了这段代码:

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])();
}

为函数指针。它也为此引发了错误。

4

2 回答 2

2
void (*f[4])(void);
f[4]=f4;

数组在 C 中从 0 开始。访问f[4]是非法的。

于 2013-03-07T21:05:21.810 回答
0

除了你的越界数组问题之外,你还必须有这一行:

#include <stdio.h>

因为您正在使用该sprintf功能。如果你这样做,你的编译器应该给你一个错误,说你调用它不正确。您的编译器可能已经警告您它使用了隐式声明。就目前而言,它正在继续并错误地调用该函数并希望获得最好的结果。这也可能导致堆栈问题。

于 2013-03-07T21:14:31.770 回答