Punteros en C y cómo pasar variables locales como punteros

Sigo siendo un noob a C. Lo uso de forma regular, pero generalmente no uso las funciones de puntero de C. Lo que estoy tratando de hacer es pasar punteros a estructuras que ya existen en el espacio local dentro de una función . Tengo este codigo

struct WorldCamera p_viewer; struct Point3D_LLA p_subj; struct Point2D_CalcRes p_res; p_viewer.hfov = 25; p_viewer.vfov = 25; p_viewer.p.lat = 10.0f; p_viewer.p.lon = 10.0f; p_viewer.p.alt = 100.0f; p_subj.lat = 9.98f; p_subj.lon = 10.0f; p_subj.alt = 100.0f; // Do something interesting here. compute_3d_transform(&p_viewer, &p_subj, &p_res, 10000.0f); // Do something interesting here. 

El prototipo de compute_3d_transform es este:

 void compute_3d_transform(struct WorldCamera *p_viewer, struct Point3D_LLA *p_subj, struct Point2D_CalcRes *res, float cliph); 

Quiero saber si tengo esto bien. Estoy progtwigndo en un pequeño microcontrolador que no creo que tenga mucha protección de memoria. Corromper una pieza de memoria podría causar errores extraños en el futuro que serían muy difíciles de depurar. Estoy tratando de evitar el uso de la función malloc / calloc, ya que requieren un montón dedicado.

Utilice la dirección del operador & .

Ah, sí, lo tienes bien.

La razón por la que tiene razón es que, por ejemplo, &p_viewer es un puntero que apunta a la variable (para su ejemplo, local) p_viewer , que es una struct WorldCamera . Y compute_3d_transform desea que el puntero a una struct WorldCamera , para que sus intenciones como llamante coincidan con las intenciones de la persona que llama.

Por supuesto, sin ver la intención completa (que solo puede ser obtenida leyendo el progtwig, incluyendo compute_3d_transform , o al menos su documentación), puede haber un error lógico, pero el hecho de que los tipos coincidan ya es de gran comodidad (de Por supuesto, si el tipo fuera void * lugar, entonces hay más dolores de cabeza porque la intención no es tan clara)

Supongo que su función compute_3d_transform escribe su resultado en p_res : si eso es todo lo que hace, su código está bien.

Solo asegúrese de no almacenar los punteros a las variables locales en otro lugar, de modo que puedan utilizarse después de que las variables queden fuera del scope.

Su código es correcto, y la corrupción de memoria es poco probable.

Lo que hay que tener en cuenta es cualquier efecto secundario de las funciones a las que está pasando punteros. Especialmente con los punteros para astackr los datos asignados, esos punteros deben considerarse inválidos una vez que regrese de la función que contenía los datos.

Todo se reduce a saber qué está pasando con tus punteros. La función compute_3d_transform probablemente utiliza los parámetros del visor y del sujeto como entrada, y llena el área a la que apunta el parámetro de resultado. No almacena los punteros, por lo que pueden usarse más adelante, por lo que no hay efectos secundarios después de que se haya completado compute_3d_transform . (Los parámetros de puntero que se usan solo como entrada generalmente se marcan const , para marcar el área objective como constante para los fines de esa función).