[C]Dynamische Speicherallokation für eine Instanz einer Struktur

Bexx

Verrückte Erfinderin bei Daniel Düsentrieb
Hallo,

ich moechte ein Programm weiter schreiben, das verschiedene Daten aufnehmen kann. Ich habe eine Struktur angelegt, die diese Daten speichern soll. Nun möchte ich mich aber nicht auf eine Groesse beschränken, sondern moechte mit malloc Speicher reservieren.
Frage: Welchen Datentyp gebe ich in malloc an, wenn ich für eine Instanz einer Struktur Speicher reservieren möchte, wenn die Struktur verschiedene Datentypen(char und float) fasst?

Bsp:

Code:
struct daten
{
    char name[25];
    char adresse[50];
    char telefon[20];
    char geb_dat[10];
    float betrag;
};

main()
{
struct daten * rec;
}

Kann mir da jemand helfen?
 
Hallo,

ich moechte ein Programm weiter schreiben, das verschiedene Daten aufnehmen kann. Ich habe eine Struktur angelegt, die diese Daten speichern soll. Nun möchte ich mich aber nicht auf eine Groesse beschränken, sondern moechte mit malloc Speicher reservieren.
Frage: Welchen Datentyp gebe ich in malloc an, wenn ich für eine Instanz einer Struktur Speicher reservieren möchte, wenn die Struktur verschiedene Datentypen(char und float) fasst?
Das ist malloc ziemlich egal. Bei malloc mußt du nur die Größe des Speichers angeben den du allozieren möchtest.

Gruß
 
Super, danke für die extrem schnelle Antwort.
Ich probiers direkt mal aus.

Gruß

Bexx
 
Hmmm.... Ich habe mich mal dran gemacht und das ganze ausprobiert, aber es funktioniert nicht, weil ich malloc ja casten muss und ich nicht weiss auf was...
Ausserdem folgende Schwierigkeit hinzu- kann auf die Instanz nicht wie folgt zugreifen.

rec = ...........

Wie würde die korrekte Syntax für diesen Ausdruck aussehen?
 
Hmmm.... Ich habe mich mal dran gemacht und das ganze ausprobiert, aber es funktioniert nicht, weil ich malloc ja casten muss und ich nicht weiss auf was...
Warum schreibst du deinen C Code auch in einer C++ Datei? Das ist nicht sinnvoll.

Außerdem steht doch da zu was du es casten mußt, bzw. der Compiler sagt dir ja dann dass es nicht möglich ist void* zu "Typ X" umzuwandeln.
Ausserdem folgende Schwierigkeit hinzu- kann auf die Instanz nicht wie folgt zugreifen.

rec = ...........

Wie würde die korrekte Syntax für diesen Ausdruck aussehen?
Bitte erläutere dein Problem. Wie lautet die vollständige Anweisung und wie lautet die Fehlermeldung? Was willst du überhaupt damit erreichen?

Gruß
 
Folgende Fehlermeldung zum Cast :
error C2440: 'initializing' : cannot convert from 'void *' to 'eingabe'
und die Zweite:
error C2040: 'liste' : 'eingabe *' differs in levels of indirection from 'eingabe'.

eingabe ist der Strukturname in meinem Programm und liste die Instanz.
Nächster Error:

error C2065: 'liste' : undeclared identifier

Und so hab ichs probiert:

liste =malloc(MAX * sizeof (eingabe));

Danach möchte ich prüfen, ob die Eingabe groesser als MAX ist und ggf. Speicher erweitern (ab da weiss ich wie ichs mache).
 
Zuletzt bearbeitet:
Moin,

poste doch mal den gesamten Code dazu .

Also bei uns ging das früher (als wir noch malloc gearbeitet haben :suspekt:) problemlos:
Code:
BYTE *databuf = (BYTE *)malloc( sizeof meinDatenStruct );

Nutzt Du denn nun wirklich nur C oder doch C++ ?

Gruß
Klaus

[EDIT]
(a) Dein error2065 sagt doch schon, dass Deine 'liste' nicht deklariert ist (zumindest nicht in dem Kontext)
(b) Speicher erweitern? Ich hoffe, nicht mit 'realloc' - das kann böse Speicherlecks schaffen!
(c) Was genau ist 'eingabe'?
 
Zuletzt bearbeitet:
Nutze nur C, zur Zeit ist der Code noch auf 10 Eingaben beschränkt (zum Test).
Möchte die Instanz überall durch einen Zeiger ersetzen und allokieren (so solls mal werden auf jeden Fall :))

Hier der Code:
Code:
// Arrays von Strukturen (Eingabe).cpp : main project file.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <io.h>

#define MAX 10

struct eingabe
{
	char vname[21];
	char nname[21];
	char adresse[60];
	char geb_dat[10];
	float betrag;
	char telefon[21];
};

int i;
int wahl = 0, nbr = 0;

int main(void)
{	
	liste =malloc(MAX * sizeof (eingabe));
	struct eingabe *liste;
	
	/*for (int j = 0; j < MAX; j++)
	{
		liste[j].betrag = 0;
	}
	float gesamt;
	wahl = 0;
	gesamt = 0;
	for (i = 0; i < MAX; i++)
	{

		printf("Bitte Vornamen eingeben: ");
		scanf("%s",liste[i].vname);
		
		printf("\nBitte Nachnamen eingeben: ");
		scanf("%s",liste[i].nname);

		printf("\nBitte Adresse eingeben: ");
		scanf("%s",liste[i].adresse);

		printf("\nGeburtsdatum im Format \"01.01.1999\": ");
		scanf("%s",liste[i].geb_dat);

		printf("\nGeben Sie die Hoehe der Sende ein: ");
		scanf("%f", &liste[i].betrag);
		
		printf("\nTelefonnummer im Format 123-456 eingeben: ");
		scanf("%s",liste[i].telefon);
		
		printf("\n\nWeitere Eintragungen machen? (1 = JA, 2 = NEIN) ");
		scanf("%d", &wahl);
		printf("\n");
		
		gesamt += liste[i].betrag;
		nbr = i+1;
		
		if (wahl == 2)
		{
			printf("\nHauptmenue:\n");
			break;
		}
	}
	wahl = 0;
	while (wahl != 4)
	{
		printf("\n\n");
		printf("Waehlen Sie bitte aus: 1- Eintraege anzeigen\n");
		printf("                       2- Durchschnittliche Spendenhoehe pro Person\n");
		printf("                       3- Spenden gesamt\n");
		printf("                       4- Abbrechen\n");
		scanf("%d", &wahl);
		
		switch (wahl)
		{
		case 1:
		
		for (i = 0; i < MAX; i++)
		{
			printf("\nSpender: %s %s Geburtsdatum: %s", liste[i].vname, liste[i].nname, liste[i].geb_dat);
			printf("\nAdresse: %s", liste[i].adresse);
			printf("\nSpendenhoehe: %.2f Euro", liste[i].betrag);
			printf("\nTelefon: %s", liste[i].telefon);
		}
		break;
		case 2:
			printf("Durchschnittliche Spende p.P.: %.2f  Euro", gesamt / nbr);
			break;
		
		case 3:
			printf("Es wurden insgesamt %.2f Euro Spenden eingenommen!", gesamt);
			break;
		
		case 4:
			printf("Auf Wiedersehen!\n");
			break;
		getch();
		return 0;
		}
	}*/
}

Nutze deshalb den C++ Compiler, weil ich keinen anderen guten C Copmiler gefunden habe und ich finde, dass der Borland eine echte Krankheit ist...:mad:
 
Moin,

als Erstes tausche mal diese beiden Zeilen:
Code:
liste = malloc(MAX * sizeof (eingabe));
struct eingabe *liste;

Merke: immer ERST deklarieren, DANN verwenden :eek:

Nutze deshalb den C++ Compiler, weil ich keinen anderen guten C Copmiler gefunden habe und ich finde, dass der Borland eine echte Krankheit ist...

Wenn Du eh' schon mit C++ compilierst, dann würde ich mir auch ernsthaft überlegen, satt "malloc/free" besser "new/delete" zu verwenden. Das ist weitaus sicherer und weniger fehleranfällig !

Gruß
Klaus
 
Zurück