1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Dynamische Speicherverwaltung und Strukturen in C

  • Harry1
  • 27. August 2012 um 11:24
  • Unerledigt
  • Harry1
    2
    Harry1
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 27. August 2012 um 11:24
    • #1

    Hallo, ich studiere E-Technik im 2. Semester, lerne gerade für unsere Informatik Klausur, in der wir die Programmiersprache C behandeln und wundere mich über eine Lösung, die ich mit meinem zwar mit meinem Übungsgruppenleiter ausgearbeitet habe jedoch meiner Meinung nach ein Teil fehlt.
    Hier erst einmal die Aufgabe:


    • Legen Sie eine Struktur test_struct an, die als Elemente die Variablen int a, float b, char *c enthaelt.
    • Definieren Sie mittels typedef einen neuen Datentypen mystruct fuer diese Struktur.
    • Deklarieren Sie einen Pointer vom Typ mystruct. Allozieren Sie nun dynamisch Speicher fuer 20 Elemente vom Typ mystruct und lassen Sie den soeben deklarierten Pointer auf diesen allozierten Speicherbereich zeigen.
    • Geben Sie den Speicherbereich wieder frei.
    • Legen Sie nun ein Array mit Platz fuer 20 Pointer vom Typ mystruct an. Initialisieren sie diese 20 Pointer indem Sie Sie nun mit Hilfe einer Schleife fuer jeden dieser Pointer Platz fuer 100 Elemente vom Typ mystruct allozieren. Allozieren sie ferner fuer den Pointer char *c jeder Struktur Speicherplatz fuer 100 Elemente vom Typ char.
    • Initialisieren Sie fuer alle eben allozierten Elemente die Variable a mit 1, die Variable b mit 2.0 und c mit "test".
    • Geben Sie den allozierten Speicherbereich wieder frei.

      Problem an dem folgenden Code ist, das ich bei Punkt 5. keinen Speicherbereich für char *c alloziere. Jedoch bin ich ein wenig hilflos an welcher Stelle ich dies tun sollte.
      Hier meine Lösung:

      C
      #include <stdio.h>
      #include <stdlib.h>
      int main() {
          struct test_struct {
              int a;
              float b;
              char *c;
          };
          typedef struct test_struct mystruct;
      
      
      
      
          mystruct *pm;
          pm = (mystruct*) malloc(20 * sizeof(mystruct));
          free(pm);
      
      
      
      
          mystruct *str[20];
      
      
      
      
          int i;
          for (i = 0; i < 20; i++) {
              str[i] = (mystruct*) malloc(100 * sizeof(mystruct));
              str[i]->a = 1;
              str[i]->b = 2.0;
              str[i]->c = "test";
          }
          free(str);
          return 0;
      Alles anzeigen

      Die einzige Idee die ich hätte wäre, mit in die for Schleife, bevor ich c initialisiere:
      "str[i]->c=(char*)malloc(100*sizeof(char);
      hineinzubringen. Jedoch zweifle ich noch an der Richtigkeit.

      ich würde mich über Tipps, Kommentare oder Hinweise freuen.
      Gruß Harry

    2 Mal editiert, zuletzt von Harry1 (27. August 2012 um 15:10) aus folgendem Grund: Code formatieren

  • Harry1
    2
    Harry1
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 27. August 2012 um 11:38
    • #2

    Ok ich glaube ich habe es nun selbst entwickelt bekommen würde mich trotzdem freuen falls jemand nochmal die Richtigkeit überprüfen könnte ;).

    C
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    
    struct test_struct {
    	int a;
    	float b;
    	char *c;
    };
    typedef struct test_struct mystruct;
    
    
    
    
    int main() {
    	mystruct *pm;
    	pm = (mystruct*) malloc(20 * sizeof(mystruct));
    	free(pm);
    
    
    
    
    	mystruct *str[20];
    
    
    
    
    	int i;
    	for (i = 0; i < 20; i++) {
    		str[i] = (mystruct*) malloc(100 * sizeof(mystruct));
    		int j;
    		for (j = 0; j < 100; j++) {
    
    
    
    
    			str[i][j].a = 1;
    			str[i][j].b = 2.0;
    			str[i][j].c = (char*) malloc(sizeof(char) * 100);
    			str[i][j].c[0] = 't';
    			str[i][j].c[1] = 'e';
    			str[i][j].c[2] = 's';
    			str[i][j].c[3] = 't';
    			str[i][j].c[4] = '\0';
    		}
    	}
    
    
    
    
    	for (i = 0; i < 20; i++) {
    		int j;
    		for (j = 0; j < 100; j++) {
    
    
    
    
    			free(str[i][j].c);
    		}
    		free(str[i]);
    	}
    	return 0;
    }
    Alles anzeigen

    Einmal editiert, zuletzt von Harry1 (27. August 2012 um 15:11)

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 27. August 2012 um 14:50
    • #3

    vielleicht ein paar hinweise:

    *) bitte verwende code-tags, so unformatierten code mag ich nie lesen (und ich denke den anderen hier geht es auch so)
    *) void * returns castet man nicht ("man 9 style" auf openbsd, bzw. c-faq)
    *) ich mag mallocs in der version lieber: "x = malloc(sizeof(*x));". netter wenn sich der typ aendert.
    *) mixed dec & code seh ich auch, aber keine ahnung ob du C90 sein willst/musst.
    *) fuer so speicherzeug ist "valgrind --leak-check=yes" immer ganz hilfreich.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

    Einmal editiert, zuletzt von Kampi (27. August 2012 um 14:52)

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Tags

  • dyn speicherverwaltung
  • malloc
  • sprache c
  • struct
  • strukturen

Rechtliches

Impressum

Datenschutzerklärung