Hallo Markus,
typedef struct tag* Person;
[...]
personen = (Person *)calloc(2, sizeof(Person));
[...]
personen[0]->vname = (char *)strdup(vname1);
Ich darf das mal etwas anders schreiben:
struct tag **personen = (struct tag **)calloc(2, sizeof(struct tag *));
Damit allozierst Du einen Speicherbereich, in den zwei Zeiger passen und weist die Adresse dieses Speicherbereichs an die Variable personen zu, die selbst nur ein Zeiger ist.
Die Zeiger im Speicherbereich sind jedoch (wg. calloc) mit 0 initialisiert, d.h. Du versuchst in der Zeile personen[0]-> den NULL-Zeiger zu dereferenzieren. Du müsstest in Deinem Fall vorher noch separate Speicherbereiche allozieren, die die Struktur selbst enthalten, damit Du die Struktur dann befüllen kannst. Also:
personen = (struct tag **)calloc(2, sizeof(struct tag *));
personen[0] = (struct tag *)calloc(1, sizeof(struct tag));
personen[1] = (struct tag *)calloc(1, sizeof(struct tag));
/* ab *jetzt* ist personen[0] gültig! */
personen[0]->vname = (char *)strdup(vname1);
/* ... */
Allerdings: In diesem Fall kommt mir das *extrem* umständlich vor, Du willst ja offensichtlich nur ein Array haben - warum dann ein Array auf Zeiger auf die Struktur und nicht ein Array der Struktur selbst?
struct tag *personen = (struct tag *)calloc(2, sizeof(struct tag));
personen[0].vname = (char *)strdup(vname1);
/* ... */
Außerdem ist sizeof(personen) ebenso 4, wie auch sizeof(Person). Wieso?
Weil beides Zeiger sind und Du auf einem 32bit-System (32 Bit == 4 Bytes) arbeitest - und sizeof eben die Größe der Variable oder des Typen liefert und nicht die Größe dessen, worauf die Variable oder der Typ zeigt. Wenn Du sizeof(struct tag) machst, dann erhälst Du auch die korrekte Größe der Struktur (was in Deinem Fall vmtl. 12 wäre).
Btw: Nix für ungut, aber Du solltest Dir wirklich langsam mal ein gutes Buch zum Thema C zulegen. Denn anscheinend können die Antworten, die wir Dir hier geben, Dir keine Klarheit über das Zeiger-Konzept in C schaffen.
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