Un puntero de función contiene la dirección de una función, sea lo que sea que eso signifique para un sistema dado. Puede usarlo para llamar a la función indirectamente, puede asignar y comparar valores de puntero de función. También puede convertir un puntero a otro tipo de puntero a función, y así sucesivamente.
La manera más directa para que un compilador implemente un puntero de función es como la dirección de memoria de la función, y la mayoría de los compiladores lo hacen de esa manera, pero el estándar de lenguaje no especifica eso. Algunos sistemas (creo que el AS/400 de IBM es un ejemplo) almacenan información adicional en indicadores de función. Un compilador podría implementar indicadores de función como índices enteros en una tabla de descriptores, siempre que la semántica requerida se implemente correctamente.
No es posible desreferenciar un puntero de función. Una llamada a función requiere un puntero, no un nombre de función, como expresión de prefijo; si usa un nombre de función, ese nombre se convierte implícitamente en un puntero (en lo que se refiere al lenguaje, el código máquina generado puede ser diferente). De modo que no hay una forma portátil para que un programa detecte si los punteros a las funciones realmente contienen direcciones de memoria o no.
no de forma portátil, dada una función func
, se puede hacer algo como:
printf("Address of func is %p\n", (void*)func);
y usted probablemente ver algo que se parece a una representación legible de una dirección de memoria.Pero, en sentido estricto, el comportamiento de la conversión del puntero a la función void*
no está definido por el idioma, y podría no funcionar en algunos sistemas.
Usted fuerza incluso ser capaz de convertir un puntero de función a unsigned char*
y examinar el código máquina de la función, pero va mucho más allá de lo definido por la norma C.
Lo mejor es tratar los punteros de función como valores opacos que se refieren a funciones particulares de alguna manera no especificada.
¿Ve los accesos ilegales a la memoria en los punteros a su función o en otros punteros? –
¿Qué significa "nos enfrentamos a muchos errores en los punteros debido a acceso ilegal a la memoria"? ¿Cómo ocurren estos errores? ¿Cuáles son estos errores? –
@Steve No @ S.Lott Me refería a los errores que obtenemos cuando inicializamos int * a alguna basura que es dirección de memoria protegida. –