Qual è il tipo corretto da utilizzare per dichiarare un metavariable che forse potrebbe corrispondere sia variabili o membri di una struttura?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Qual è il tipo corretto da utilizzare per dichiarare un metavariable che forse potrebbe corrispondere sia variabili o membri in una struttura?

Prendete per esempio il seguente codice sorgente di esempio:

#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 seguente semantica di patch :

@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@

ptr = malloc(E);
+if (ptr == NULL)
+       return;

l'assegnazione ptr->s non corrisponde a meno che non viene utilizzato expression ptr. Per utilizzare expression per questo sembra un po 'troppo ampia per me. È questo corretto e l'unico modo per farlo?

È stato utile?

Soluzione

In generale, si vuole prendere qualsiasi puntatore lvalue - ma dal momento che si sta solo corrispondenti luoghi in cui l'espressione è assegnato un valore da malloc, un'espressione semplice farà il buon lavoro (dal momento che un non-puntatore o non-lvalue dovrebbe rendere il compilatore lamentarsi).

Il problema si sta andando ad avere è se l'espressione ha effetti secondari, come ad esempio:

struct some_struct *a[10];
int i = 0;

a[i++] = malloc(sizeof(struct some_struct));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top