vectores resueltos punteros matrices lenguaje ejercicios dobles apuntadores c function-pointers calling-convention

resueltos - ¿Por qué puedo invocar una función a través de un puntero con demasiados argumentos?



punteros y matrices en c (2)

Digamos que tengo esta función:

int func2() { printf("func2/n"); return 0; }

Ahora declaro un puntero:

int (*fp)(double);

Esto debería apuntar a una función que toma un argumento double y devuelve un int .

func2 NO tiene ningún argumento, pero aún cuando escribo:

fp = func2; fp(2);

(siendo 2 un número arbitrario), func2` se invoca correctamente.

¿Porqué es eso? ¿No tiene sentido el número de parámetros que declaro para un puntero de función?


Debe declarar explícitamente el parámetro, de lo contrario obtendrá un comportamiento indefinido :)

int func2(double x) { printf("func2(%lf)/n", x); return 0; }


Sí, hay un significado. En C (pero no en C ++), una función declarada con un conjunto vacío de paréntesis significa que toma un número no especificado de parámetros. Cuando haces esto, estás impidiendo que el compilador verifique el número y los tipos de argumentos; es un remanente desde antes de que el lenguaje C fuera estandarizado por ANSI e ISO.

Si no se llama a una función con el número y los tipos de argumentos adecuados, se obtiene un comportamiento indefinido . Si en su lugar declara explícitamente que su función toma cero parámetros usando una lista de parámetros de void , el compilador le dará una advertencia cuando asigne un puntero de función del tipo incorrecto:

int func1(); // declare function taking unspecified parameters int func2(void); // declare function taking zero parameters ... // No warning, since parameters are potentially compatible; calling will lead // to undefined behavior int (*fp1)(double) = func1; ... // warning: assignment from incompatible pointer type int (*fp2)(double) = func2;