2013-03-07 19 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. 

, но когда я нажимаю войти, он бросает исключение, указав «Run-Time Check Failure # 2 - Стопка вокруг переменной «f» была повреждена ».

Пожалуйста, объясните мне причину этого, а также когда следует использовать snprintf и sprintf. Кроме того, дайте мне знать, почему я не могу использовать

for(i=0;i<4;i++) 
{ 
    (*f[i])(); 
} 

для указателя функции. Это также вызывает ошибку.

+3

Примечание: 'sprintf' делает что-то ___ совершенно иное___, чем вы могли бы подумать. Вы хотите использовать 'printf'. См. Также http://en.cppreference.com/w/c/io/fprintf – Zeta

ответ

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

Массивы начинаются с 0 на C. Доступ к f[4] является незаконным.

0

В дополнение к вашей из проблемы границ массива, вы должны иметь следующую строку:

#include <stdio.h> 

потому, что вы используете функцию sprintf. Если вы это сделаете, ваш компилятор должен сообщить вам, что вы неправильно его назвали. Ваш компилятор, вероятно, предупредил вас, что он использует неявное объявление. Как бы то ни было, он идет вперед и неправильно вызывает функцию и надеется на лучшее. Это может также вызвать проблему стека.