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.

しかし、Enter キーを押すと、「実行時チェックの失敗 #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 に答える