Frage zu struct array in C, warum wird Zahl nicht in Konsole ausgegeben?

2 Antworten

In Version 1:

   MESSWERTE *daten =malloc(MAX_ANZAHL*sizeof(daten));

daten ist ein Zeiger. Du erzeugst also ein Feld für MAX_ANZAHL Zeiger. Das geht hier nur gut, weil MESSWERTE nur einen int speichern, der in der Regel genauso groß ist. Sobald Du neben number noch weitere Felder definierst, wird es knallen.

Korrekt wären folgende Ausdrücke:

  • MAX_ANZAHL*sizeof *daten
  • MAX_ANZAHL*sizeof daten[0]
  • MAX_ANZAHL*sizeof(MESSWERTE)

In Version 2:

   MESSWERTE *daten [MAX_ANZAHL];

Damit legst Du ein Array von Zeigern auf MESSWERTE an. Die Zeiger werden nicht initialisiert. Damit schreibst Du die 1 an eine zufällige Adresse im Speicher. Das Programm müsste eigentlich sofort mit einer Zugriffsverletzung abbrechen.

Falls daten[0] zufällig im erlaubten Speicherbereich liegt, wirst Du irgendeine andere Variable überschreiben. Dann sollte das Programm laufen, aber Du wirst dich später wundern, warum diese Variable plötzlich einen falschen Wert enthält. Solche Fehler sind extrem schwer zu finden.

Jeder C-Compiler, der nicht älter als 40 Jahre ist, sollte bei Deinem Code eine Warnung ausgeben.

Am einfachsten wäre:

   MESSWERTE daten [MAX_ANZAHL];

Das erzeugt wie in Version 1 ein Array von Messwerten.

Das Array daten speichert nur Zeiger auf structs, die aber nicht automatisch angelegt werden. Das heißt deinem ersten Element solltest du noch ein struct zuweisen.

Entweder so:

struct messwert wert;
daten[0] = &wert;

oder so:

daten[0] = (struct messwert*) malloc(sizeof(struct messwert));

jasmin8911 
Fragesteller
 24.01.2024, 11:01

Ok Danke. Aber dies muss ich nur so machen wenn ich bei dem array daten eine fixe größe vergebe. Wenn ich dies so mache wie in meiner Version1 (dynamisch), dann werden die Zeiger auf structs automatisch angelegt?

0
regex9  28.01.2024, 02:32
@jasmin8911

Version 1 klappt, da mit malloc Speicher für die Daten reserviert wurde, wenn auch die Berechnung des Speicherplatzes falsch ist. Mit daten beziehst du dich auf den Zeiger (je System [16-/32-/64-bit] entspricht das 2-8 Byte). Aber eigentlich möchtest du doch Platz für deine structs reservieren.

malloc(MAX_ANZAHL * sizeof(struct messwert))
0