elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Representación visual de punteros y punteros a punteros..
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Representación visual de punteros y punteros a punteros..  (Leído 4,800 veces)
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #10 en: 3 Mayo 2019, 18:01 pm »

La cuestión con los punteros a funciones es que depende del compilador, sistema operativo, etc. a dónde apunten. La respuesta obvia sería "a la dirección de la función", pero qué es exactamente eso o en dónde existe, depende de la implementación. Lo que sí podrías dar por hecho es que las funciones no viven ni en la pila ni en el heap. Típicamente las instrucciones ejecutables se colocan en un parte de la memoria conocida como el segmento de texto (a veces llamado segmento de código), que suele ser de sólo lectura.


En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #11 en: 3 Mayo 2019, 23:57 pm »

Vale, entonces se aloja en una especie de registro...

Ya se han aclarado varias dudas
Gracias


En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #12 en: 4 Mayo 2019, 00:09 am »

En la línea:
Código:
int (* pSumar) (int)(int) = sumar; 
hay un error, debería ser:
Código:
int (*pSumar) (int, int) = &sumar; // el & delante no es extrictamente necesario pero conviene


Citar
Vale, entonces se aloja en una especie de registro...
Tampoco.

Como te decía RayR, la dirección de una función (no de una "función miembro", recuerdas?) suele estar en memoria de sólo lectura (que en inglés la vas a encontrar como "code segment" o "text segment"). Entonces, un puntero a función va a apuntar a esa parte de la memoria que no es stack ni heap, sino la parte donde está el código del programa cuando se carga en memoria.

En algún momento también se mencionó que los "string literals" ("hola mundo" por ejemplo) también estaban en un sector especial de memoria de solo lectura, el "data segment", que tampo es stack ni heap.

Con respecto a la Call Stak, Hay un artículo en Wikipedia que vale la pena ser leído:
https://en.wikipedia.org/wiki/Call_stack

Por si no quedara del todo claro, no hay que perder de vista que cuando se habla de la "memoria" se trata de la "virtual address space". Creo que aquí encontrarás respuesta a las dudas que ni siquiera sabías que debías tener:
https://en.wikipedia.org/wiki/Virtual_address_space

[Nota]
También es cierto que estas representaciones corresponden a un modelo, el "C Abstract Machine Model" [http://web.stanford.edu/group/sequoia/cgi-bin/book/export/html/15], que es un modelo abstracto que los compiladores se encargan de trasladar a la máquina real.
Habitualmente los microprocesadores suelen tener niveles de memoria caché y evitan acceden directamente la disco o a la memoria RAM, y en un sistema suele haber más de un microprocesador con más de un "core" cada uno, y es frecuente que compartan los mismos datos, figúrate. Apropósito de esto, el C++ define su "memory model" https://en.cppreference.com/w/cpp/language/memory_model
[/Nota]
« Última modificación: 4 Mayo 2019, 00:22 am por Loretz » En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #13 en: 4 Mayo 2019, 01:54 am »

Tal cual te lo explicó Loretz. Creo que yo te confundí cuando te dije que dependía. Pasa que C deja muchas cosas abiertas a que los compiladores las implementen como quieran, siempre que cumplan con ciertas condiciones. En el caso de los punteros a funciones, sé que al menos en algún compilador viejo de C, no apuntaban directamente a la dirección de la función, sino a una estructura rara y de ahí ya la localizaban. En realidad, con los compiladores/arquitecturas actuales, puedes estar bastante seguro de que apuntan a la dirección de la función en el segmento de código. Es sólo que el pedante que a veces habita en mí sale y dice: ¡no necesariamente!  :D. Eso sí, no olvides que esto se refiere a punteros a funciones; en el caso de funciones miembro, como dice Loretz, es algo muy diferente y depende totalmente de cada implementación.

Por cierto, los ejemplos que habías puesto al principio, donde los punteros estaban en la pila, son correctos siempre que los punteros sean variables locales no static. Las variables globales y las variables locales declaradas como static, (llamémoslas de forma general, variables de duración estática), se localizan en el segmento de datos. Para ser más específicos (dado que puede que leas sobre esto en otro lado y te puedas confundir), en el archivo compilado, las variables de duración estática inicializadas (ejemplo: static int n = 5;) se colocan en la sección data. Las variables de duración estática no inicializadas no se suelen almacenar en el archivo binario (dado que no tienen ningún valor específico, no tendría caso ocupar espacio) sino que se coloca su tamaño conjunto en una sección llamada bss. Cuando el programa se ejecuta, los datos inicializados se colocan en el segmento de datos (data segment). En cuanto a los no inicializados, se reserva la cantidad de espacio que bss especifica, y se inicializan a cero, también en el segmento data. Porque una vez que el programa está en ejecución ya no se suele hacer distinción entre data y bss: todo se encuentra en data.

Editado: no sé qué pasó que mi mensaje había quedado hecho un lío. En fin, en resumen, si los punteros fueran globales o locales static, se encontrarían en el segmento de datos. Los datos apuntados por ellos, naturalmente, no se verían afectados.
« Última modificación: 4 Mayo 2019, 02:37 am por RayR » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
punteros
Programación Visual Basic
bautistasbr 4 2,271 Último mensaje 30 Septiembre 2005, 19:35 pm
por NYlOn
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 5,167 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Punteros dobles / Punteros a puntero.
Programación C/C++
NOB2014 5 8,415 Último mensaje 13 Abril 2016, 16:00 pm
por MAFUS
(Consulta) Punteros a punteros en C
Programación C/C++
class_OpenGL 1 2,014 Último mensaje 19 Julio 2016, 14:29 pm
por class_OpenGL
Consulta sobre punteros y doble punteros
Programación C/C++
palacio29 4 3,365 Último mensaje 17 Mayo 2019, 20:40 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines