2010-10-14 20 views
7

¿Intentando entender qué representa realmente el puntero a la función? ¿Es la dirección en el segmento de código donde reside la función?¿Qué representa el valor del puntero de un puntero a la función?

Por ejemplo: este pedazo de código:

#include <stdio.h> 

void foo(void) 
{ 
} 

int main(void) 
{ 
    int a = 10; 
    printf("a's address: %p\n", &a); 
    printf("foo's address: %p\n", foo); 
    return 0; 
} 

... impresiones de esto:

[sh/prog-exercises/adam]:./a.out 
a's address: 0xbfffb414 
foo's address: 0x8048430 

supongo que soy un poco confundido con la forma apilar exactamente/montón de un proceso se relaciona con el segmento de datos/segmento de código ELF. Cualquier sugerencia útil sería realmente bienvenida. Además, mi primera pregunta, así que por favor se amable, estoy tratando de aprender. ¡Gracias!

Respuesta

5

Esa es la dirección del punto de entrada de la función - inicio de su código. La variable a está ubicada en la pila, por lo que no sorprende que su dirección difiera significativamente: a la pila y al código se les asignan diferentes regiones de código que pueden ser bastante diferentes.

+0

Correcto, ¿entonces la salida aquí representa la ubicación donde se ha cargado esta función particular como parte del segmento de código? ¿Hay alguna manera para que un programa C imprima el segmento de datos, las direcciones de comienzo/finalización del segmento de código? – helpmelearn

+0

@helpmelearn: Sí, esa es la dirección donde se encuentra el inicio de la función. No conozco una solución para encontrar las direcciones de los segmentos y supongo que dependería de la implementación. Tal vez haya algún programa de utilidad que pueda hacer esto para cualquier proceso. – sharptooth

3

Esta imagen del libro UNIX: Systems Programming debería dejar las cosas claras.

En la parte inferior del diagrama, tiene el texto del programa (direcciones bajas). Como se puede verificar desde tu programa. Ahí es donde residiría foo().

alt text

2

Una cosa a tener en cuenta es que su código no es totalmente compatible con las normas. Si usa gcc -Wall -Wextra -pedantic -ansi, recibirá una queja sobre la línea donde está imprimiendo el puntero a la función. Esto se debe a que el estándar no garantiza que los punteros a las funciones se puedan convertir a punteros vacíos. C está diseñado para funcionar en muchas arquitecturas diferentes, y si la arquitectura es una arquitectura de Harvard (instrucción separada y memoria de datos) puede haber buenas razones para hacer que estos punteros sean de diferentes tamaños.

Supongo que en la práctica no es probable que importe, pero es un buen hecho a tener en cuenta. Esp cuando intenta conocer los detalles íntimos de C.

Cuestiones relacionadas