¿Dónde se almacenan las funciones en la memoria en c? ¿Alguien puede explicarlo en un lenguaje simple?
#include stdio.h> void g() { int a=7; } int main() { printf("%d\n",sizeof(g())); printf("%p",&g); return 0; }La salida del siguiente programa es
1 00007ff6ee001581y donde la variable dentro de la función se almacena y se vincula con la dirección de la función
La variable dentro de la función se almacena en la pila.
Y cada parte de enlace y direccionamiento se realiza mediante el enlazador.
En palabras simples, el enlazador decide qué dirección absoluta dar a qué etiqueta o función y el compilador decide cómo se organizarán y cómo podrán dirigirse entre sí.
La compilación requiere cuatro pasos:
Preprocessing [in which header file and microprocessor worked upon]. Compiling[In which they are converted into assembly code] Assembly[In which codes are converted into machine level language but have relative addressing in respect to there starting] Linking[When absolute address is given so when loaded they can address each other and files and linked in one]#creo que estas ultimas lineas te pueden ayudar
Las funciones y las variables son etiquetas y cada etiqueta se traduce en dirección. El código que se ejecuta en la máquina tiene una dirección que representa estas etiquetas. Y no solo c, sino que todos los lenguajes compilados pasan por él. Como en la máquina, su código de máquina o simplemente cableado.
Di si no entendiste nada. Estaré encantado de ayudarte.
La salida del siguiente programa es
La segunda línea de salida es un puntero al código de la función g . Es la dirección de esa función, y es la respuesta literal a su pregunta sobre dónde se almacena la función.
y donde la variable dentro de la función se almacena y se vincula con la dirección de la función
La variable a es una variable local, por lo que solo existe mientras se ejecuta la función. Por lo general, el compilador creará espacio para las variables locales en la pila; esa es una de las razones principales para tener una pila. Una vez que la función regresa, sus variables locales se sacan de la pila y dejan de existir. En otras palabras, a no está conectado a la ubicación de g en absoluto.
Por lo general, se hace referencia a las variables locales a través de algún desplazamiento desde el puntero de la pila. Cuando llama a una función, se crea un marco de pila en la pila. El marco de pila consiste básicamente en el almacenamiento de todas las variables locales de la función, y también la dirección del puntero de pila anterior y la dirección de retorno. Luego, el código de la función comienza a ejecutarse y, dado que el compilador conoce la dirección relativa de cada variable (es decir, dónde se encuentra en el marco de la pila), puede calcular fácilmente la dirección absoluta. La mayoría de los procesadores tienen instrucciones que facilitan el direccionamiento relativo precisamente por esta razón. Cuando la función sale, el puntero de la pila vuelve al marco de la pila anterior y el procesador salta a la dirección de retorno. Pero esta es solo una posible implementación; en los procesadores modernos que tienen muchos registros, es posible que las variables locales ni siquiera se almacenen en la pila; es posible que terminen en registros.
include <stdio.h> void g() { int a=7; } int main() { //printf("%d\n",sizeof(g())); //you cant use sizeof(g()) its a functiona and //function not have anysize printf("%p",&g); //even you can't use here int a=7 that you declared in void g() as it is local to //that function and this function cant access any function local variable //but what it returns return 0; }Si desea ver el direccionamiento, vea esto:
0000000000001135 <g>: 1135: 55 push %rbp 1136: 48 89 e5 mov %rsp,%rbp 1139: c7 45 fc 07 00 00 00 movl $0x7,-0x4(%rbp) 1140: 90 nop 1141: 5d pop %rbp 1142: c3 retq 0000000000001143 <main>: 1143: 55 push %rbp 1144: 48 89 e5 mov %rsp,%rbp 1147: 48 8d 35 e7 ff ff ff lea -0x19(%rip),%rsi # 1135 <g> 114e: 48 8d 3d af 0e 00 00 lea 0xeaf(%rip),%rdi # 2004 <_IO_stdin_used+0x4> 1155: b8 00 00 00 00 mov $0x0,%eax 115a: e8 d1 fe ff ff callq 1030 <printf@plt> 115f: b8 00 00 00 00 mov $0x0,%eax 1164: 5d pop %rbp 1165: c3 retq 1166: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 116d: 00 00 00