Hallo,
ich habe eine Struktur, die ich als Datentyp verwenden will. Daraufhin möchte ich ein Array mit diesen Typen erzeugen und den einzelnen Elementen Werte zuweisen. Mein ursprünglichen Programm wäre zu umfangreich, somit habe ich ein Miniprogramm mit dem gleichen Problem nachgebaut:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct tag {
char* vname;
char* nname;
int age;
};
typedef struct tag* Person;
void show_name(struct tag *p);
extern char* strdup(const char *s1);
int main(void) {
//2 Personen anlegen
Person* personen;
//Hiermir soll simuliert werden, dass name1 und name2 bereits Werte haben wenn sie den Personen übergeben werden
char* vname1 = "Markus";
char* nname1 = "Müller";
char* vname2 = "Thomas";
char* nname2 = "Mustermann";
personen = (Person *)calloc(2, sizeof(Person));
printf("Größe einer Person: %d\n", sizeof(Person));
printf("Größe des Personenarrays: %d\n", sizeof(personen));
printf("vname1: %s\n", vname1);
personen[0]->vname = (char *)strdup(vname1);
personen[0]->nname = (char *)strdup(nname1);
personen[0]->age = 20;
personen[1]->vname = (char *)strdup(vname2);
personen[1]->nname = (char *)strdup(nname2);
personen[1]->age = 30;
for (int i = 0; i < 2; i++)
show_name(personen[i]);
return 0;
}
void show_name(Person p) {
printf("%s\n ", p->vname);
printf("%s \n", p->nname);
printf("%d \n", p->age);
}
Der Speicherzugriffsfehler tritt bereits hier auf:
personen[0]->vname = (char *)strdup(vname1);
Ich komme einfach nicht dahinter, wie ich vname einen Wert zuweisen kann, da immer ein Speicherzugriffsfehler entsteht. strdup alloziert bereits Speicher. Daran kann es also nicht liegen. Selbst mit strcpy oder einer Direktzuweisung bekomme ich Speicherzugriffsfehler. Das kann doch nicht so schwer sein? Außerdem ist sizeof(personen) ebenso 4, wie auch sizeof(Person). Wieso?
Markus.