Christian Seiler: / C: Pointer "überprüfen.."

Beitrag lesen

Hallo Martin,

oder b) wie initialisiere ich alle Pointer default mit NULL. (Angenommen, das struct hat n Elemente, möchte ich ja nicht n Elemente auf NULL setzen)

Easy:  memset(&var, 0, sizeof(var));

Weitere Alternative für den Stack:

foo_t my_foo = { NULL };

bzw. für kompliziertere Strukturen:

typedef struct bar_s {  
  int a;  
  int b;  
  double c;  
  void *d;  
} bar_t;

bar_t my_bar = { 0, 0, 0.0, NULL };

bzw. auch erlaubt ist (aber wird von verschiedenen Compilern zurecht mit einer Warnung quittiert):

bar_t my_bar = { 0 };

(Wenn man nur { 0 } schreibt heißt es, alle Felder werden mit 0 initialisiert.)

Da letzteres schlechter Stil ist, ersteres aber von der Strukturdefinition abhängt, empfiehlt es sich, ein Makro direkt neben der Struktur zu definieren:

typedef struct bar_s {  
  int a;  
  int b;  
  double c;  
  void *d;  
} bar_t;  
  
#define BAR_T_INITIALIZER  { 0, 0, 0.0, NULL }

Und dann:

bar_t my_bar = BAR_T_INITIALIZER;

Je nach Compiler kann das schneller als memset() sein, muss aber nicht, da in neueren Compilern memset() oftmals eine eingebaute interne Funktion ist, die durch effizienten Assembler-Code an genau der Stelle ersetzt wird. Ist daher wohl Geschmackssache, was man nimmt.

Viele Grüße,
Christian

--
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
            -- Kommentar bei TDWTF