Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: CSQCasimiro en 31 Agosto 2012, 21:09 pm



Título: [duda] Struc en C/C++, direcciones en memoria
Publicado por: CSQCasimiro en 31 Agosto 2012, 21:09 pm
hola a todos, como andan ? , veran, estoy optimizando un codigo mio con funciones super genericas (que sean capases de resivir cualquier tipo de estruc y recorrer cada uno de sus campos) , el tema es que realizandolo me surgio una duda, sobre como son asignados los espacios en memoria de una estructura, por ejemplo la siguiente:

Código
  1.  
  2. struct dato
  3. {
  4.    int ID;
  5.    int lock;
  6. };
  7.  
  8.  

yo se que si le doy un sizeof (dato) , me dará 8 ( cada dato int ocupa 4 byte), mi pregunta es esta, supongamos que la estructura empieza en la direccion de memora 0x0001 , esa dirección de inicio, también corresponde a la de inicio de int ID ? y si le sumo 4 byte mas, osea, 0x0005 , esa seria la dirección de memoria de int lock ?

desde ya muchas gracias.


Título: Re: [duda] Struc en C/C++, direcciones en memoria
Publicado por: avesudra en 31 Agosto 2012, 21:22 pm
Hola CSQCasimiro pues mira no lo sabía pero tampoco está de más compilar este código que hecho y comprobarlo , y sí , es tal y como dices.Una cosita cuida la ortografía  :o reCiBir , capaCes.
Código
  1. #include <stdio.h>
  2.  
  3. struct dato
  4. {
  5.    int ID;
  6.    int lock;
  7. };
  8. int main()
  9. {
  10.    struct dato dato1;
  11.    printf("Direccion de la Estructura: \t%X\n",&dato1);
  12.    printf("Direccion de ID: \t\t%X\n",&dato1.ID);
  13.    printf("Direccion de lock: \t\t%X\n",&dato1.lock);
  14.    return 0;
  15. }
  16.  
Mi salida es esta:
Código:
Direccion de la Estructura      28FF18
Direccion de ID                 28FF18
Direccion de lock               28FF1C

Process returned 27 (0x1B)   execution time : 0.005 s
Press any key to continue.
Si restas la dirección de lock (28FF1C) a la dirección de 28FF18, te queda 4 que es el largo de bytes de ID , los bytes de lock , serían:
Primer byte:   28FF1C
Segundo byte: 28FF1D
Tercer byte:    28FF1E
Cuarto byte:   28FF1F
¡Un saludo!


Título: Re: [duda] Struc en C/C++, direcciones en memoria
Publicado por: CSQCasimiro en 31 Agosto 2012, 21:34 pm
genial, muchas gracias, me sacaste la duda :D
después mas tarde subiré acá la función en la que lo aplique como método practico por si alguien en algún futuro necesita un ejemplo de uso =P
huy que mal no note esas faltas de ortografía O_o

PD: viva la aritmética de punteros


Título: Re: [duda] Struc en C/C++, direcciones en memoria
Publicado por: avesudra en 31 Agosto 2012, 21:39 pm
genial, muchas gracias, me sacaste la duda :D
huy que mal no note esas faltas de ortografía O_o

PD: viva la aritmética de punteros

De nada , la que acabo de liar modificando el post dios  :xD , ten en cuenta que siempre es así , pero que también puedes declarar otros punteros en la estructura e inicializarlos como malloc o calloc, que lo que haría sería apuntar a otra zona de memoria pero el puntero estaría en esa estructura pero eso mismo , el Puntero(dirección de memoria) , no el dato, digo esto porque a lo mejor quieres acceder a un dato y al hacer esa optimización tuya accedes a un puntero. Lo mismo digo , antes no entendía porque la arítmetica de punteros era tan fascinante , pero ya sí.


Título: Re: [duda] Struc en C/C++, direcciones en memoria
Publicado por: CSQCasimiro en 6 Septiembre 2012, 22:26 pm
no me gusta revivir temas tan viejos, pero lo prometido es deuda...

es una función que busca en un archivo de struc de cualquier dimensión un dato int, y vos solo le pasas la ruta del archivo, a partir de cuantos byte empieza ese dato en la estructura, cuanto mide (es redundante por que es siempre 4, error mio) y la cantidad de registros que posee (para eso ya tengo otra función que mostrare mas abajo)

Código
  1.  
  2. int Buscar_int (const char* ruta,int principio /*luego de cuantos byte empieza el campo buscado en la estructura*/, int fin /* tamaño de int, si es redundante xd*/, int registros, int dato )
  3. {
  4.    FILE *f;
  5.    int buffer;
  6.  
  7.    f=fopen(ruta,"rb");
  8.  
  9.    for(int i=0; i< registros; i++)
  10.    {
  11.        fseek(f,pricipio,1);
  12.  
  13.        fread(buffer, fin, 1, f);
  14.  
  15.        if (buffer==dato) //se puede hacer otra con strcpy para cadenas de caracteres
  16.        {
  17.            fclose(f);
  18.            return i; //regresa lugar en el archivo en cual se encuentra
  19.        }
  20.    }
  21.  
  22.    fclose(f);
  23.    return -1; //-1 si no existe
  24. }
  25.  
  26.  

y la de cantidad de registros

Código
  1.  
  2. int Cant_registros(const char* ruta, size_t tam) //size_t es lo que regresa sizeof (tipo de variable)
  3. {
  4.    int tamanio;
  5.  
  6.    FILE *f;
  7.    f=fopen(ruta,"rb");
  8.    error_archivo("\t ERROR: no se pudo abrir el archivo - T x 78", &f);
  9.    //si, soy tan vago que hasta cree una función con un simple if(f==NULL) y mensaje...
  10.  
  11.    fseek(f,0,2);
  12.  
  13.    tamanio=(ftell(f)/tam);
  14.  
  15.    fclose(f);
  16.    return tamanio;
  17. }
  18.  

y ahora por que yo decía que eso era algo muy general ? por que en la facultad me mandaron un trabajo con 5 estructuras diferentes (y por ende archivos diferentes) y que en todas había que hacerle cosas similares y yo de vago cree esas funciones para cualquiera que sea la estructura.