¿Cuál es el tipo correcto para utilizar para declarar una metavariable que podría coincidir con variables o miembros de una estructura?
-
20-09-2019 - |
Pregunta
¿Cuál es el tipo correcto para utilizar para declarar una metavariable que podría coincidir con variables o miembros de una estructura?
Tomemos por ejemplo el siguiente código fuente de ejemplo:
#include <stdio.h>
#include <stdlib.h>
struct some_struct {
int i;
char *s;
};
void test(void)
{
struct some_struct *ptr;
char *s;
s = malloc(100);
ptr = malloc(sizeof(struct some_struct));
ptr->s = malloc(100);
puts("done");
}
Con la siguiente semántica parche :
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
la asignación ptr->s
no se corresponde a menos que se utiliza expression ptr
. Para utilizar expression
para esto parece un poco demasiado amplia para mí. Si esto es correcto y la única manera de hacerlo?
Solución
En general, se desea capturar cualquier puntero lvalue - pero ya que sólo está a juego lugares donde la expresión se le asigna un valor de malloc
, una expresión normal va a hacer el trabajo fino (ya que un no-puntero o no lvalue debe realizar el compilador se quejan).
El problema que va a tener es si la expresión tiene efectos secundarios, por ejemplo:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));