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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos  (Leído 6,968 veces)
cgrs

Desconectado Desconectado

Mensajes: 4

0xBADA55


Ver Perfil WWW
[?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos
« en: 28 Mayo 2016, 21:04 pm »

Muy buenas a todos,

Estando trabajando con punteros y reserva de memoria, se me planteó la duda siguiente:

¿Sería posible pedir memoria de tipo general (void, unsigned char...) y luego utilizar alguna de sus zonas con un cast para guardar datos con distinto tipo?

¿Sería válido el código siguiente?
Código
  1. unsigned char *array = (unsigned char *)malloc(1024*sizeof(unsigned char)); // array de 1k
  2. int *enteros = (int *) &array[20]; // a partir del elemento 20, utilizar enteros (?)



« Última modificación: 28 Mayo 2016, 22:51 pm por cgrs » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [?][C] Utilizar zonas de memoria con distintos tipos
« Respuesta #1 en: 28 Mayo 2016, 21:30 pm »

Sí. En C++ hay que tener más cuidado con eso. Pero en C, malloc retorna dirección que usas para lo que tú quieras

Código
  1. void* temp = malloc(100);
  2.  
  3. int* tInt = temp;
  4. char* tChar = temp;
  5.  
  6. int tIntSize = 100/sizeof(int),
  7.    tCharSize = 100/sizeof(char);
  8.  
  9. tChar[0] = 'h';
  10. tChar[1] = 'o';
  11. tChar[2] = 'l';
  12. tChar[3] = 'a';
  13. printf("%i", tInt[0]);

Puse así un ejemplo porque responder con un "sí" rotundo quedaría feo :P


En línea

cgrs

Desconectado Desconectado

Mensajes: 4

0xBADA55


Ver Perfil WWW
Re: [?][C][C++] Utilizar zonas de memoria con distintos tipos
« Respuesta #2 en: 28 Mayo 2016, 21:38 pm »

Y, ya que estamos, ¿en C++ como se podría hacer? porque justamente es lo que estoy utilizando para la manejar la API de Win32 (que es un dolor viviente).

Muchas gracias por tu respuesta ;)
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [?][C] Utilizar zonas de memoria con distintos tipos
« Respuesta #3 en: 28 Mayo 2016, 22:04 pm »

Puse así un ejemplo porque responder con un "sí" rotundo quedaría feo :P

 ;-) ;-) ;-) ;-) Buen ejemplo y si se puede.

Código
  1. unsigned char *array = (unsigned char *)malloc(1024*sizeof(unsigned char)); // array de 1k
  2. int *enteros = (int *) &array[20]; // a partir del elemento 20, utilizar enteros (?)

El codigo que muestras es valido pero realmente no veo la nececidad de hacerlo, por que no reservar memoria para un solo tipo de dato?

Tambien podrias hacer uso de structuras:

Código
  1. struct test {
  2. char array[20];
  3. int enteros[X];
  4. }
  5.  
  6. struct test  *temp = (struct test*) malloc(sizeof(struct test));
  7.  
  8.  

Aunque realmente no se que quieras hacer.

Saludos
En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: [?][C] Utilizar zonas de memoria con distintos tipos
« Respuesta #4 en: 28 Mayo 2016, 22:06 pm »

En c++ es igual solo se cambia un poco la forma en que se reserva memoria ya que se usa el operador new para reservar y delete para liberar la memoria

Mira te dejo esta simple implementacion:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. void funcion(void *datos, unsigned int len){
  7.    char *cDatos=(char*)datos;
  8.     char c='A';
  9.  
  10.    for(unsigned int i=0;i<len ;i++){
  11.        cDatos[i]=c;
  12.        c++;
  13.    }
  14.    cout<<cDatos<<endl;
  15. }
  16.  
  17. int main()
  18. {
  19.  
  20.    int *memoria=new int[10];
  21.    funcion(memoria,10);
  22.  
  23.    delete[] memoria;
  24.    return 0;
  25. }
  26.  

Con respecto a la API  no es tan complicada, pero si tienes dudas puntuales sobre como hacer algo no dudes en preguntar.
En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [?][C][C++] Utilizar zonas de memoria con distintos tipos
« Respuesta #5 en: 28 Mayo 2016, 22:29 pm »

Y, ya que estamos, ¿en C++ como se podría hacer? porque justamente es lo que estoy utilizando para la manejar la API de Win32 (que es un dolor viviente).

Muchas gracias por tu respuesta ;)
En C++ es idé3ntico, salvo porque hacerlo con clases es más peligroso (según). Si utilizas malloc para reservar espacio para una clase o estructura, no llamarás a los constructores, lo que puede desencadenar problemas.
En línea

cgrs

Desconectado Desconectado

Mensajes: 4

0xBADA55


Ver Perfil WWW
Re: [?][C] Utilizar zonas de memoria con distintos tipos
« Respuesta #6 en: 28 Mayo 2016, 22:50 pm »

Muchas gracias a todos por las respuestas, parece que me voy aclarando :D.

Aunque realmente no se que quieras hacer.

Lo único raro que hago en C++ (con las llamadas a la API de Windows) es llamar a HeapAlloc con GetProcessHeap, guardando esa zona de memoria y utilizándola a conveniencia.

Llegué a ver un ejemplo de un profesor que utilizaba memcpy en Unix (aunque no me acuerdo muy bien para qué lo hizo XD), ¿para Windows habría algo parecido?
« Última modificación: 28 Mayo 2016, 22:53 pm por cgrs » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos
« Respuesta #7 en: 28 Mayo 2016, 22:56 pm »

memcpy es una función de la librería string.h (cstring en C++)
En línea

cgrs

Desconectado Desconectado

Mensajes: 4

0xBADA55


Ver Perfil WWW
Re: [?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos
« Respuesta #8 en: 28 Mayo 2016, 23:06 pm »

memcpy es una función de la librería string.h (cstring en C++)

Efectivamente, el profesor la utilizaba creo que para duplicar un bloque de memoria, con el tamaño que quisiera, pero como no estoy muy seguro de sus motivos, dejaré de lado el uso de esa función  ::)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [?][C][C++][WIN32] Utilizar zonas de memoria con distintos tipos
« Respuesta #9 en: 28 Mayo 2016, 23:23 pm »

Efectivamente, el profesor la utilizaba creo que para duplicar un bloque de memoria, con el tamaño que quisiera, pero como no estoy muy seguro de sus motivos, dejaré de lado el uso de esa función  ::)

memcpy(A,B, N)
Copia N bytes de la dirección B a la dirección A, no más. Se suele usar más que nada para vitar hacer el bucle:
Código
  1. for(int i=0; i<N; i++) A[i] = B[i];
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Distintos tipos de sesiones.
Nivel Web
APOKLIPTICO 0 4,383 Último mensaje 15 Julio 2009, 02:11 am
por APOKLIPTICO
Función que retorna dos tipos distintos de datos.
Programación C/C++
samur88 9 7,294 Último mensaje 18 Mayo 2011, 20:52 pm
por samur88
crear arreglo con distintos tipos de datos?
Programación C/C++
.:UND3R:. 5 3,555 Último mensaje 18 Junio 2013, 12:56 pm
por pacoperico
Parametro que acepte distintos tipos de variables.
Programación C/C++
Gojira 3 4,562 Último mensaje 1 Marzo 2018, 20:45 pm
por Gojira
Esta extensión te permitirá comprobar cómo se ve una web en distintos tipos ...
Noticias
wolfbcn 1 4,704 Último mensaje 25 Noviembre 2019, 13:48 pm
por z3nth10n
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines