2013-03-07 97 views
1

我寫了這個代碼:爲什麼該異常聲明「運行時檢查失敗#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])(); 
} 

函數指針。這也是一個錯誤。

+3

備註:'sprintf'做的事情完全不同於你想象的。你想使用'printf'。另見http://en.cppreference.com/w/c/io/fprintf – Zeta 2013-03-07 21:05:14

回答

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

從C開始的數組訪問f[4]是非法的。因爲你使用的sprintf功能

#include <stdio.h> 

0

除了你越界數組問題,你必須有此行。如果你這樣做,你的編譯器會給你一個錯誤,說你錯誤地調用了它。您的編譯器可能已經警告過您使用了隱式聲明。就目前而言,它會繼續前進,錯誤地調用功能並希望獲得最佳效果。這也可能導致堆棧問題。

相關問題