Al pasar una estructura a otra función, que por lo general sería mejor que hacer como se sugirió anteriormente Donnell y pasarlo por referencia en su lugar.
Una buena razón para esto es que facilita las cosas si desea realizar cambios que se reflejarán cuando regrese a la función que creó la instancia de la misma.
Aquí es un ejemplo de la forma más sencilla de hacer esto:
#include <stdio.h>
typedef struct student {
int age;
} student;
void addStudent(student *s) {
/* Here we can use the arrow operator (->) to dereference
the pointer and access any of it's members: */
s->age = 10;
}
int main(void) {
student aStudent = {0}; /* create an instance of the student struct */
addStudent(&aStudent); /* pass a pointer to the instance */
printf("%d", aStudent.age);
return 0;
}
En este ejemplo, el argumento de la función addStudent()
es un puntero a una instancia de una estructura student
-student *s
.En main()
, creamos una instancia de la estructura student
y luego le pasamos una referencia a nuestra función addStudent()
usando el operador de referencia (&
).
En la función addStudent()
podemos hacer uso del operador flecha (->
) para eliminar la referencia al puntero, y acceder a cualquiera de sus miembros (funcionalmente equivalentes a: (*s).age
).
Cualquier cambio que hacemos en la función addStudent()
se reflejarán cuando volvamos a main()
, porque el puntero nos dio una referencia al lugar donde en la memoria se almacena la instancia de la estructura student
. Esto se ilustra con printf()
, que dará como resultado "10" en este ejemplo.
Si no hubiera pasado una referencia, en realidad estaría trabajando con una copia de la estructura que pasó a la función, lo que significa que los cambios no se reflejarán cuando regrese a main
, a menos que implemente una forma de aprobar la nueva versión de la estructura de nuevo a main o algo así!
Aunque los indicadores pueden parecer desalentadores al principio, una vez que entiendes cómo funcionan y por qué son tan útiles se convierten en algo natural y te preguntas cómo habrás podido lidiar sin ellos.
¿Dónde declaras tu estructura? En su archivo de implementación real, ¿dónde está su código 'struct student {/ * ... * /};'? Parece que está en el ámbito incorrecto (como declarado en la función 'main' o en cualquier función que intente llamar' addStudent' de ... –
sí, está en el ámbito de mi función –