[duda] Struc en C/C++, direcciones en memoria

Iniciado por CSQCasimiro, 31 Agosto 2012, 21:09 PM

0 Miembros y 1 Visitante están viendo este tema.

CSQCasimiro

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:



struct dato
{
    int ID;
    int lock;
};



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.
"Mejora el Algoritmo, no el Código"
"Buscando todos los días ser mejor que ayer"

avesudra

#1
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.
#include <stdio.h>

struct dato
{
   int ID;
   int lock;
};
int main()
{
   struct dato dato1;
   printf("Direccion de la Estructura: \t%X\n",&dato1);
   printf("Direccion de ID: \t\t%X\n",&dato1.ID);
   printf("Direccion de lock: \t\t%X\n",&dato1.lock);
   return 0;
}

Mi salida es esta:

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!
Regístrate en

CSQCasimiro

#2
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
"Mejora el Algoritmo, no el Código"
"Buscando todos los días ser mejor que ayer"

avesudra

#3
Cita de: CSQCasimiro en 31 Agosto 2012, 21:34 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í.
Regístrate en

CSQCasimiro

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)



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 )
{
    FILE *f;
    int buffer;

    f=fopen(ruta,"rb");

    for(int i=0; i< registros; i++)
    {
        fseek(f,pricipio,1);

        fread(buffer, fin, 1, f);

        if (buffer==dato) //se puede hacer otra con strcpy para cadenas de caracteres
        {
            fclose(f);
            return i; //regresa lugar en el archivo en cual se encuentra
        }
    }

    fclose(f);
    return -1; //-1 si no existe
}



y la de cantidad de registros



int Cant_registros(const char* ruta, size_t tam) //size_t es lo que regresa sizeof (tipo de variable)
{
    int tamanio;

    FILE *f;
    f=fopen(ruta,"rb");
    error_archivo("\t ERROR: no se pudo abrir el archivo - T x 78", &f);
    //si, soy tan vago que hasta cree una función con un simple if(f==NULL) y mensaje...

    fseek(f,0,2);

    tamanio=(ftell(f)/tam);

    fclose(f);
    return tamanio;
}


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.
"Mejora el Algoritmo, no el Código"
"Buscando todos los días ser mejor que ayer"