¿Cuál es el tipo correcto para utilizar para declarar una metavariable que podría coincidir con variables o miembros de una estructura?

StackOverflow https://stackoverflow.com/questions/2043787

  •  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?

¿Fue útil?

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));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top