English 中文(简体)
Complicated C cast explanation
原标题:

I m trying to figure out what the following code in C does?

((void(*)())buf)();

where buf is a char array.

最佳回答

Let s take it one step at a time.

void(*)()

This is a pointer to a function that takes unspecified arguments and has no return value.

(void(*)())buf

simply casts buf to this function pointer type. Finally,

((void(*)())buf)();

calls this function.

So the entire statement is "interpret buf as a pointer to a void function without arguments, and call that function."

问题回答

It casts buf to a function pointer of type void(*)() (A function returning nothing/void and taking unspecified arguments) and calls it.

The ANSI standard does not really allow the casting of normal data pointers to function pointers, but your platform may allow it.

I tend to use the "cdecl" command when I come across a mind boggling declaration. Example:

[me@machine]$ cdecl
Type `help  or `?  for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void

Although there are cases where I do wish that there s a tool out there that explains the output of "cdecl" :/

This casts buf to the type void (*)(), a pointer to a function that takes unspecified parameters and returns nothing. Then it calls the function at that address (the two rightmost parentheses).

((void(*)())buf)();
 ------------/         cast `buf` to
 ---------/            type: pointer to function accepting a fixed but
                              unspecified number of arguments and
                              returning void
----------------/      and call that "function"

It casts buf into a function pointer, that takes unspecified arguments, and calls it.

I would guess that in many circumstances, it crashes the machine. Otherwise, it treats the array as a pointer to a function that returns void and invokes it.

You might find "expert c programming" a good read - unpacking this kind of thing is in one of the chapters, if I remember right. It s a long time since I read it, but I remember thinking it was worth the effort at the time. http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

There is an online version of the cdecl tool that lsc mentioned that you might find useful : http://www.cdecl.org/

calls a function pointer. the function has no arguments.

Function Pointer - Wikipedia





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签