Autor
|
Tema: [duda] Struc en C/C++, direcciones en memoria (Leído 2,848 veces)
|
CSQCasimiro
Desconectado
Mensajes: 20
|
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.
|
|
|
En línea
|
"Mejora el Algoritmo, no el Código" "Buscando todos los días ser mejor que ayer"
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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 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: 28FF1CSegundo byte: 28FF1DTercer byte: 28FF1ECuarto byte: 28FF1F¡Un saludo!
|
|
« Última modificación: 31 Agosto 2012, 21:36 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
CSQCasimiro
Desconectado
Mensajes: 20
|
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
|
|
« Última modificación: 31 Agosto 2012, 21:38 pm por CSQCasimiro »
|
En línea
|
"Mejora el Algoritmo, no el Código" "Buscando todos los días ser mejor que ayer"
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
genial, muchas gracias, me sacaste la duda 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 , 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í.
|
|
« Última modificación: 31 Agosto 2012, 21:41 pm por avesudra »
|
En línea
|
Regístrate en
|
|
|
CSQCasimiro
Desconectado
Mensajes: 20
|
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; for(int i=0; i< registros; i++) { fread(buffer , fin , 1, f ); if (buffer==dato) //se puede hacer otra con strcpy para cadenas de caracteres { return i; //regresa lugar en el archivo en cual se encuentra } } 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; 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... 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.
|
|
|
En línea
|
"Mejora el Algoritmo, no el Código" "Buscando todos los días ser mejor que ayer"
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Calculo direcciones de Memoria, Paginacion
Programación General
|
Darksythe
|
1
|
4,664
|
5 Enero 2012, 21:41 pm
por modo_senin
|
|
|
Direcciones de memoria
Programación C/C++
|
Maik33
|
4
|
2,846
|
17 Octubre 2012, 14:48 pm
por Maik33
|
|
|
Duda direcciones de memoria C
« 1 2 3 »
Programación C/C++
|
dRak0
|
23
|
10,035
|
19 Julio 2013, 16:38 pm
por rir3760
|
|
|
[Duda]Como resuelve el PE Loader direcciones de memoria en secciones ejecutables
Programación C/C++
|
BloodSharp
|
2
|
2,614
|
24 Septiembre 2014, 19:46 pm
por BloodSharp
|
|
|
Algun crypter que modifique las direcciones de memoria ?
« 1 2 »
Ingeniería Inversa
|
TrashAmbishion
|
14
|
9,256
|
16 Julio 2016, 04:24 am
por TrashAmbishion
|
|