Jenil Mewada
Jenil Mewada

Reputation: 595

Unable to understand a pointer statement

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?

Upvotes: 7

Views: 506

Answers (3)

Nisse Engström
Nisse Engström

Reputation: 4752

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;

Upvotes: 2

Milind Deore
Milind Deore

Reputation: 3063

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;

Upvotes: 0

pmg
pmg

Reputation: 108938

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;

Upvotes: 5

Related Questions