typedef void ( * void_fptr) ( ) ;
void show_a( )
{
printf ( "This is show_a function\n " ) ; }
void_fptr func_gen( void_fptr func)
{
int a = 500 ;
printf ( "fptr = %d, address of fptr = %p\n " , func
,& func
) ; printf ( "a = %d, address of a = %p\n " , a
,& a
) ; void inside_func( void ) {
printf ( "\n begin inside_func { \n \n " ) ; printf ( "fptr = %d, address of fptr = %p\n " , func
,& func
) ; printf ( "a = %d, address of a = %p\n " , a
,& a
) ; }
return & inside_func;
}
int main( )
{
void_fptr ptr;
ptr = func_gen( & show_a) ;
( * ptr) ( ) ;
return 0 ;
}
dHlwZWRlZiB2b2lkICgqdm9pZF9mcHRyKSgpOwoKdm9pZCBzaG93X2EoKQp7CiAgICBwcmludGYoIlRoaXMgaXMgc2hvd19hIGZ1bmN0aW9uXG4iKTsKfQoKdm9pZF9mcHRyIGZ1bmNfZ2VuKHZvaWRfZnB0ciBmdW5jKQp7CiAgICBpbnQgYSA9IDUwMDsKICAgIHByaW50ZigiZnB0ciA9ICVkLCBhZGRyZXNzIG9mIGZwdHIgPSAlcFxuIixmdW5jLCZmdW5jKTsKICAgIHByaW50ZigiYSA9ICVkLCBhZGRyZXNzIG9mIGEgPSAlcFxuIixhLCZhKTsKICAgIHZvaWQgaW5zaWRlX2Z1bmModm9pZCkgewogICAgICAgIHByaW50ZigiXG5iZWdpbiBpbnNpZGVfZnVuYyB7IFxuXG4iKTsKICAgICAgICBwcmludGYoImZwdHIgPSAlZCwgYWRkcmVzcyBvZiBmcHRyID0gJXBcbiIsZnVuYywmZnVuYyk7CiAgICAgICAgcHJpbnRmKCJhID0gJWQsIGFkZHJlc3Mgb2YgYSA9ICVwXG4iLGEsJmEpOwogICAgICAgIHByaW50ZigiXG59IGluc2lkZV9mdW5jIFxuIik7CiAgICB9CiAgICByZXR1cm4gJmluc2lkZV9mdW5jOwp9CmludCBtYWluKCkKewogICAgdm9pZF9mcHRyIHB0cjsKICAgIHB0ciA9IGZ1bmNfZ2VuKCZzaG93X2EpOwogICAgKCpwdHIpKCk7CgogICAgcmV0dXJuIDA7Cn0=