Es legal definir stdin como sigue:
#define stdin (&_iob[0])
Donde _iob es un arreglo de estructura tipo FILE.
¿Despues yo podria hacer esto? ¿Por que?
stdin->flag
y entrar a la variable flag de la estructura FILE
¿Se pueden usar el operador de desreferencia sobre una dirección de memoria?
o debria definir a stdin asi:
#define stdin (_iob)
El operador desreferencia es precisamente para acceder a lo apuntado por una dirección de memoria. ¿Por qué no ibas a poder?
De todos modos, evita acceder a los campos de la estructura FILE, puedes hacer las operaciones con las funciones que la librería trae consigo.
De poderse de puede hacer pero como te comentan es mejor usar las definiciones que ya tienen las librerias.
La clausula define es solo para el compilador y sustituye cada occurencia del primer parametro por el segundo en el codigo fuente antes de compilarlo ejemplo:
#include<stdio.h>
#define _ printf
int main() {
_("Hello World\n");
return 0;
}
Sustituye en el codigo cada _ por printf
En tu caso sustituiria cada stdin por la definicion que muestras.
Saludos!
El operador de desreferencia sirve para acceder a lo apuntado por una dirección de memoria. El problema es que esa dirección de memoria no apunta a nada, esa dirección de memoria es una estructura tipo FILE no un puntero. ( O ESO ES LO QUE ENTIENDO).
Cita de: fafafa01 en 6 Septiembre 2017, 12:12 PM
El operador de desreferencia sirve para acceder a lo apuntado por una dirección de memoria. El problema es que esa dirección de memoria no apunta a nada, esa dirección de memoria es una estructura tipo FILE no un puntero. ( O ESO ES LO QUE ENTIENDO).
_iob es una matriz de FILE, que contiene varios FILE. Aunque sea un array, se puede acceder a él como si fuera un puntero. Hay pequeñas diferencias entre array y puntero, pero bueno, parecidos.
Claro pero para mi se tendría que definir así:
#define stdin (_iob)
En este caso al aplicarle el operador de desreferencia:
*(_iob)
estarías accediendo al primer elemento del arreglo:
(_iob[0])
en el otro caso:
#define stdin (&_iob[0])
este codigo es equivalente a este otro:
#define stdin (&*(_iob+0))
al aplicar el operador de desregerencia:
* (&*(_iob+0))
Le estarias aplicando el operador de desreferencia a la direccion de memoria del primer elemento de la estructura FILE.
#define stdin (&*(_iob+0))
Esto se desarrollaría así:
#define stdin (&*K) // K -> FILE[]
#define stdin (&K) // K -> FILE
#define stdin K // K -> FILE*
Ten en cuenta, en el último paso, que '&' es una referencia; "añade un puntero (*)".
Por tanto, stdin es un FILE.
Cita de: ivancea96 en 6 Septiembre 2017, 22:23 PM
#define stdin (&*(_iob+0))
Esto se desarrollaría así:
#define stdin (&*K) // K -> FILE[]
#define stdin (&K) // K -> FILE
#define stdin K // K -> FILE*
Ten en cuenta, en el último paso, que '&' es una referencia; "añade un puntero (*)".
Por tanto, stdin es un FILE.
No entiendo ¿que es esa K?
¿Como yo quiero definir stdin esta mal?
#define stdin (&*A) // A -> FILE[]
// B = *A
#define stdin (&B) // B -> FILE
// C = &B
#define stdin C // C -> FILE*