Почему этот код работает? - C (СИ)
Формулировка задачи:
Добрый день. Столкнулся с тем, что код ниже не приводит к ошибкам при работе. Не могу понять, почему он не падает? Ведь он должен рушить стек. Или подскажите при каких условиях он будет падать? Компилятор - VS 2010.
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
void fv( int a );
int fv2 ();
int (*pfv)(int);
int _tmain(int argc, _TCHAR* argv[])
{
int a = 1;
pfv = (int (__cdecl *)(int) ) fv; // вот тут косяк - указатель на функцию типа int,
// а возвращает она void
a = fv2();
printf( "%i ", a);
getch();
return 0;
}
void fv( int a )
{
int c = 2;
return;
}
int fv2 ()
{
int a = 3;
(*pfv)(1);
return a;
}Решение задачи: «Почему этот код работает?»
textual
Листинг программы
int fv2 ()
{
int a = (*pfv)(1);
return a;
}
Объяснение кода листинга программы
В данном коде:
- fv2 - название функции, которая принимает на вход нет аргументов и возвращает целочисленное значение.
- a - переменная типа int, которая инициализируется значением, возвращаемым функцией pfv с аргументом 1.
- pfv - указатель на функцию, которая не принимает на вход аргументов и возвращает целочисленное значение.
- 1 - аргумент, передаваемый в функцию pfv. Итак, при вызове функции fv2, она инициализирует переменную a значением, возвращаемым функцией pfv с аргументом 1, после чего возвращает это значение.