WinFuture-Forum.de: Struct Und Funktionen In C - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Struct Und Funktionen In C hilfe

#16 _Fenix_

  • Gruppe: Gäste

geschrieben 04. März 2008 - 19:40

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
   long int ID;
   short int semester;
   char * abschluss;
} student;

void ausgabe(student * pers) {
   printf("Person1.ID: %d\n ", pers->ID);
   printf("Person1.Semester: %d\n ", pers->semester);
   printf("Person1.Abschluss: %s\n ", pers->abschluss);
}

int main() {
   student person1;
   person1.ID=10007741;
   person1.semester=0;
   person1.abschluss = "hallo123";
   ausgabe(&person1);

   char * abneu = (char*)calloc(strlen(person1.abschluss)+4, sizeof(char));
   strncat(abneu, person1.abschluss, strlen(person1.abschluss));
   strncat(abneu, "456", 3);

   person1.abschluss = abneu;
   
   ausgabe(&person1);
   
   return 0;
}


Änderungen:
1. Mit typedef wird das Struct zu einem Typen und du brauchst nicht jedes mal struct beim Deklarieren davor schreiben.
2. Ich schreib in Source immer alles klein, bis auf Makros, die komplett groß geschrieben werden - wird in den meisten Codes so gemacht für c.
3. Eingerückt
4. abschluss ist ein Pointer auf einen Char, so ist gar keine Länge vorgegeben und mehrere Studenten können den selben Abschlussstring bekommen, sodass man z.B. Vordiplom in Bachelor umbenennen könnte, ohne an jedem Studenten rumzuändern.
5. Die Ausgabe nimmt einen Pointer auf student, denn sonst wird der student jedes mal kopiert beim ausgeben.
6. Die Zuordnung mit Stringliteralen direkt auf Pointer ist kein Problem, das macht der Compiler - man darf die Teile dann nur nicht direkt reallocieren bei Größenänderungen, sondern muss es machen, wie oben gezeigt. Nur beim realloc aufpassen, da strlen(...) die abschließende NULL nicht berücksichtigt.

Dieser Beitrag wurde von Fenix bearbeitet: 04. März 2008 - 20:09

0

Anzeige



#17 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 19:42

Beitrag anzeigenZitat (centro: 04.03.2008, 19:14)

Was ich an dieser Stelle noch sagen möchte ist das es sich bei C-Strings um Felder handelt somit darf man nicht schreiben Person1.Name= "tom".Warum?
Weil der reine Bezeichner Name ein Pointer aud ein Feld (Adresse des ersten Elements)ist.
Mit der definition char Name [256] wird ein Feld angelegt, und hierauf festgelegt.Somit kann man Name nicht verändern, was mit einer Anweisung Person1.name="tom"; gesehen würde, nämlich auf ein neues feld mit dem konstanten Inhalt "tom".Somit wäre der ursprüngliche speicher verloren und es würden weitere Probleme aufteten.
Fals ich jetzt falsch liege sorry?


Fast richtig. Meine einzige Korrektur: Die Zuweisung geht deswegen nicht, weil Person1.Name als ein konstanter, also nicht veränderbarer Pointer deklariert worden ist. Die Zuweisung müsste daher vom Compiler mit einer Fehlermeldung abgelehnt werden.

Gruß
Def
Eingefügtes Bild
0

#18 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 21:15

Hi Fenix,

ich glaube, die Format-Modifizierer für printf müsstest Du noch anpassen (long int bzw. short int statt int).
Die Speicheranforderungen habe ich jetzt nicht im Detail angesehen, aber ich meine, wenn man es ganz streng sieht, müsste man doch überprüfen ob calloc() erfolgreich war, oder?
Wahrscheinlich braucht man ein Scheitern von calloc() bei heutigen Speichergrößen und den anzunehmenden kurzen Zeichenketten nicht zu befürchten, aber wenn man sich erstmal auf diesen Standpunkt stellt, kann man auch gleich 80 Zeichen oder so reservieren und das Thema ist durch.
Mal ganz abgesehen davon, dass wir hier einen Anfänger haben, über dessen bisheriges Wissen Dein Ansatz erheblich hinausgehen dürfte... :huh:

Gruß
Def
Eingefügtes Bild
0

#19 Mitglied ist offline   centro 

  • Gruppe: aktive Mitglieder
  • Beiträge: 49
  • Beigetreten: 21. Februar 08
  • Reputation: 0

geschrieben 04. März 2008 - 22:33

Ja danke erstmal !
Musste ne Pause einlegen und habe mir erstmal Resident Evil Extinction angeschaut man diese Frau ist der Hammer ( Milla Jovovich ) von der würde ich mich auch verprügeln lassen aber ich glaube das gehört jetzt nicht hier hin oder vielleicht doch ?
Werde heute noch ne Nachtschicht einlegen. Weil das Thema mich nicht mehr loslässt .
Hoffe nur nicht, dass ich später nur noch Klassen benutzte , aber man kann ja nie genug wissen ?

Dieser Beitrag wurde von centro bearbeitet: 04. März 2008 - 22:34

0

#20 _Fenix_

  • Gruppe: Gäste

geschrieben 04. März 2008 - 22:43

Zitat

Die Speicheranforderungen habe ich jetzt nicht im Detail angesehen, aber ich meine, wenn man es ganz streng sieht, müsste man doch überprüfen ob calloc() erfolgreich war, oder?
Wahrscheinlich braucht man ein Scheitern von calloc() bei heutigen Speichergrößen und den anzunehmenden kurzen Zeichenketten nicht zu befürchten, aber wenn man sich erstmal auf diesen Standpunkt stellt, kann man auch gleich 80 Zeichen oder so reservieren und das Thema ist durch.


Falls calloc fehlschlägt, wird das Programm wahrscheinlich ohnehin unkontrolliert verrecken und der Fall ist so selten, dass sich die extra Logik - außer auf sehr kleinen Systemen - nicht lohnen würde, denke ich.
80 Zeichen reservieren ist hier ok, aber ansonsten eine schlechte Idee: Wenn den Source jemand wieder verwendet, der sich nicht die Mühe der extra Logik macht, um Eingaben auf 80 Zeichen zu stutzen, hat man ganz schnell einen Exploit.

Im allgemeinen würde ich vorschlagen statt der char Arrays für die Strings Libraries wie etwa die GLib zu benutzen. Mit char * fängt man sich sonst bei komplexeren String Operationen nur Sicherheitslücken und Speicherlecks.

Zitat

Hoffe nur nicht, dass ich später nur noch Klassen benutzte , aber man kann ja nie genug wissen ?


Die objektorientierte Programmierung ist eine abstrakte Fabrik der Hölle. Sie stellt mit ihren konkreten Ausprägungen (wie etwa C++ und Java) polymorphe Objekte zur langsam ausgeführten Folter her.

Bisschen Vitamin C hat noch keinem geschadet.


Hmm mir ist Milla zu männlich... lieber Emmy Rossum. Außerdem würde die mich wahrscheinlich hinterher für nen Zombie halten und in Stücke ballern.

Dieser Beitrag wurde von Fenix bearbeitet: 04. März 2008 - 22:46

0

#21 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 23:17

Hi Fenix,

na, das ist mal originell, die Lösung mit den 80 Zeichen aus Angst vor einem denkbaren Exploit abzulehnen, und dafür lieber calloc() nehmen, ohne den Rückgabewert zu prüfen. ;)
Spezielle Bibliotheken, die bei der Überprüfung von Array-Grenzen helfen, sind aber sicher eine gute Lösung, da stimme ich auf jeden Fall zu.
Zu C++ kann ich (noch) nicht so viel sagen, habe nämlich selbst gerade erst damit angefangen, es zu lernen. Insgesamt scheint mir C++ gegenüber C durchaus ein Fortschritt zu sein, aber ich werde sehen. Über Programmiersprachen lässt sich jedenfalls herrlich streiten... (was ich hier aber nicht tun will!) :huh:

Zu Milla Jovovich habe ich allerdings keine spezielle Meinung.

Gruß
Def

Dieser Beitrag wurde von def bearbeitet: 04. März 2008 - 23:20

Eingefügtes Bild
0

#22 _Fenix_

  • Gruppe: Gäste

geschrieben 04. März 2008 - 23:36

Wenn calloc fehlschlägt, liefert es nen nullpointer zurück.
Auf nen nullpointer zu kopieren ist unschön und sollte sicher vermieden werden, aber es *müsste* ja eigentlich keinen exploit herbeiführen, sondern nur nen Porgrammcrash, der bei Speichermangel auch gewünscht ist. Nur normal mit Fehlermeldung und so...
0

#23 Mitglied ist offline   def 

  • Gruppe: aktive Mitglieder
  • Beiträge: 386
  • Beigetreten: 19. Dezember 06
  • Reputation: 7
  • Geschlecht:Männlich

geschrieben 04. März 2008 - 23:54

Beitrag anzeigenZitat (Fenix: 04.03.2008, 23:36)

Wenn calloc fehlschlägt, liefert es nen nullpointer zurück.
Auf nen nullpointer zu kopieren ist unschön und sollte sicher vermieden werden, aber es *müsste* ja eigentlich keinen exploit herbeiführen, sondern nur nen Porgrammcrash, der bei Speichermangel auch gewünscht ist. Nur normal mit Fehlermeldung und so...


Okay, also ich glaube, wir müssen das hier nicht weiter diskutieren. Wir sind uns vermutlich beide einig,

  • dass die Lösung mit den 80 Zeichen nicht perfekt ist, wenngleich sie für Lehrbücher typisch sein dürfte,
  • dass man bei Benutzung von calloc() den Rückgabewert prüfen sollte, und dass diese Lösung aber eventuell umständlich werden kann und
  • dass die Benutzung von externen Bibliotheken die sinnvollste und eleganteste Lösung ist - zumindest für Produktionscode

Ob das Erlernen von externen Bibliotheken in diesem Lernstadium schon sinnvoll ist, oder ob man sich auf die Standardbibliotheken beschränken sollte (und mit den daraus folgenden Problemen vorerst leben sollte), da bin ich mir nicht ganz sicher. Es dürfte für beide Ansichten Argumente geben. Kommt wohl auch auf den Lernenden an.

Schöne Grüße
Def
Eingefügtes Bild
0

#24 _Fenix_

  • Gruppe: Gäste

geschrieben 05. März 2008 - 00:12

Full ACK denke ich.. ;)

Fehlt nur noch die Frage, welche Schauspielerin C kann :huh:

Dieser Beitrag wurde von Fenix bearbeitet: 05. März 2008 - 00:13

0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0