Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - MAFUS

#351
Una cadena siempre termina con el carácter \0, así que una cadena literal generada con comillas dobles tiene ese carácter al final que el compilador agrega automáticamente. También es la razón por lo que hay que agregar un carácter más a los arrays que realmente serán cadenas.

Un simple carácter de comillas simples no es una cadena, porque le falta el carácter de fin de cadena, y porque la variable que lo aloja no es un escalar entero, es decir, no es array ni puntero.
#352
Sí, o cin >> ws para eliminar los espacios en blanco. Hay unas cuantas formas de hacerlo.
#353
En lo referente a fflush(stdin): el estándar dice que fflush solo es para flujos de salida así que depende del compilador que funcione o no. Cómo norma general no deberías usarlo.

En cuanto a la recursividad: sí, está bien hecha. Tiene una condición de parada, una llamada que actualiza un estado para que active la condición de parada en el momento oportuno y un trabajo a cumplir.

Lo que hace es escribir en pantalla: Entrando en el sueño del suelo... repitiendo tantas veces del sueño como se hayan indicado en el argumento de llamada.

Por cierto, no destroces el lenguaje con x y e. El español es un de los lenguajes más ricos que existen.
#354
Seguramente es C, aunque en realidad C++ por debajo termina haciendo lo mismo. Son cosas de la expresividad del lenguaje.

Por otra parte: no se movería 4 bytes, eso en caso de que fuera un puntero a int, pero el objeto es un puntero a void. ¿Qué ocupa un dato de tipo void? Ni siquiera existe. Algunos compiladores, como GCC consideran que sumar 1 a un void* ha de apuntar al siguiente byte, pero claro puede haber otros desarrolladores de compiladores que no consideren así.
#355
En el siguiente link https://medium.com/@bartobri/untangling-complex-c-declarations-9b6a0cf88c96 te enseñarán a desmenuzar todas estas declaraciones complicadas. Hay muchos otros ejemplos en la red. Son un puzzle bastante bonito a resolver.
#356
*(void **)&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] = h->modified_function;

h->original_function : objeto, un puntero.

(char *)h->original_function : un puntero casteado a puntero a char.

((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] : dado que h->original_function ha sido casteado a char * moverse a través de él será byte a byte, por tanto esto devolverá lo que hay en el byte ASM_HOOK_CODE_OFFSET de h->original_function.

&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] : devuelve la dirección del byte ASM_HOOK_CODE_OFFSET del objeto h->original_function.

(void **)&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] : castea a void ** la dirección del byte ASM_HOOK_CODE_OFFSET del objeto h->original_function. Se reconvierte la dirección devuelta al puntero de un puntero a void.

*(void**)&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] : se obtiene la dirección del byte ASM_HOOK_CODE_OFFSET del objeto h->original_function como puntero a void.
#357
Para eso usa strcpy que sí lo coloca.
#358
Programación C/C++ / Re: Punteros
29 Junio 2018, 07:04 AM
En Ingreso x e y son punteros, por tanto en scanf...
#359
Correcto. Si haces un array de punteros dinámicos, antes de liberar el array debes liberar todos los punteros dinámicos que has generado.

Piénsalo de esta forma:
Un array, tanto dinámico como estático como cualquier otra variable, es una entrada en una tabla donde se guarda la dirección de inicio y su tamaño, a parte de su nombre y algunas cosas más.

Cuando se accede a una posición de un array se tiene en cuenta su dirección de inicio, el número de elemento y el tamaño de éstos elementos. Por tanto si liberas el array de punteros dinámicos quitarás de la tabla ese array pero los elementos existentes siguen ocupando memoria que, por el hecho de haber liberado el array y no existir más su referencia, no podrás acceder a ellos.

Por cierto, en tiempo de ejecución esa tabla no existe y todo son posiciones y offsets. Dicha tabla solo existe de forma interna para el compilador para construir el código.
#360
No debes guardar esos punteros a un archivo porque no vas a guardar la estructura sino solo su dirección. Es cómo cuándo hace años la gente iba a un cibercafé y creía que copiando los accesos directos de los juegos se los podía llevar a casa.
Con eso vengo a decir que cuándo quieras recuperar los datos del archivo en otro momento ya no existirán y lo que habrá en esa zona de memoria que has guardado será basura, o directamente no pertenecerá al ámbito de la memoria del programa.
Para guardar una estructura debes guardar miembro a miembro, si son punteros (como por ejemplo cadenas) debes guardar el contenido de dónde apunta el puntero. A la hora de recuperar los datos debes hacerlo en el mismo orden en que fueron guardados (y en el caso de datos tipo cadena, el número exacto de bytes que guardaste). Esto se debe hacer así por el hecho de que de un programa a otro, de una máquina a otra, la instancia del programa puede ordenar, de forma interna, la estructura de forma diferente para acomodarla de forma específica a ese entorno.