7

I am doing a ctf problem and there is a line i can't understand.

int  (*fp)(char *)=(int(*)(char *))&puts, i;

Can anyone explain me what does this mean?

r3mainer
  • 23,981
  • 3
  • 51
  • 88
Jenil Mewada
  • 575
  • 4
  • 14

3 Answers3

5

fp is a pointer

(*fp)

to a function

(*fp)(

that accepts 1 argument of type char

(*fp)(char)

and returns a value of type int

int (*fp)(char)

The pointer is initialized with the address of puts after a mostly redundant conversion.

int  (*fp)(char *)=(int(*)(char *))&puts
int  (*fp)(char *)=(int(*)(char *))puts // & redundant
int  (*fp)(const char *)=puts

The object i is not initialized. It has type int

int  (*fp)(char *)=(int(*)(char *))&puts, i;
pmg
  • 106,608
  • 13
  • 126
  • 198
2

First there is a variable declaration:

int  (*fp)(char *)

fp is a pointer to function, which is taking a char * parameter and returning int.

Then fp is initialized to a value:

(int(*)(char *))&puts

The value is the address of the puts function, cast to the same type as fp.

And finally, there is another variable declaration:

int /* ... */, i;
Nisse Engström
  • 4,738
  • 23
  • 27
  • 42
0

There are two parts to this declaration:

int  (*fp)(char *)=(int(*)(char *))&puts, i;

first is: int (*fp)(char *)=(int(*)(char *))&puts; explanation: This is function pointer declaration and initialisation in single statement. Where fp is the pointer to the function puts. If you print value of fp and puts they will have same value, that is address of puts.

#include<stdio.h>

int main()
{
  int  (*fp)(char *)=(int(*)(char *))&puts, i;
  printf("puts %p\n",puts);
  printf("fp %p\n",fp);
}

and second is: int i;

Milind Deore
  • 2,887
  • 5
  • 25
  • 40