Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pointer to function assignment, C

I don't understand why the following code generates a warning:

int func(double a, int b, char c)
{
    return 0;
}
int main()
{
    int(*myPointer)() = func;
    return 0;
}

I thought that in C, a function with an empty parameters list mean a function that can receive an unknown number of parameters. func4 happens to receive 3 parameters. So why is it incompatible with myPointer?

Its especially confusing because the following does compile without warning:

void boo()
{
     return;
}
int main()
{
    int(*pointerDude)(double) = boo;
    return 0;
}

What's going on?

like image 213
azphare Avatar asked Nov 25 '22 09:11

azphare


1 Answers

The difference between the two cases is explained like this: if you pass a parameter to a function that accepts none, you are just consuming some memory on the stack. If you don't pass any parameter to a function that accepts a few, the latter is going to read random data from the stack.

Update: changed to community wiki to add these corrections from Pascal Cuoq:

Casts of function pointer in both directions are legal, informative warnings from the compiler notwithstanding. Calling a function with the wrong prototype is illegal in both cases. Some ABIs mandate that the function clean up the stack, in which case passing parameters to functions that accept none corrupt the stack as surely as not passing parameters to functions that expect them.

C99 6.3.2.3 par. 8:

A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer. If a converted pointer is used to call a function whose type is not compatible with the pointed-to type, the behavior is undefined

like image 181
2 revs Avatar answered Nov 29 '22 07:11

2 revs