Variable ändert sich von selbst?
-
Hallo alle,
ich schreibe ein Programm, mit dem ich Daten bearbeiten kann... Aber bei einem Punkt komme ich nicht weiter, weil sich eine counter-Variable ändert, ohne dass ich sie verändere.
Kann mir jemand erklären, warum das passiert?
Hier ist mal der Code:
int main() { struct User *user = NULL; unsigned int number_of_users = 0; unsigned char selection = 0; unsigned char leave = 0; user = (struct User*) malloc(sizeof(struct User*)); number_of_users++; //counter erhöhen, damit das Programm weiß, wie viele Datensätze angelegt wurden printf("number_of_users: %d", number_of_users); //Groesse: 1 system("PAUSE"); while (leave == 0) { system("cls"); //Hauptmenü printf("Willkommen im Hauptmenue!\n"); printf("\n1 -> Datensatz eingeben"); printf("\n2 -> Datensatz ausgeben"); printf("\n3 -> Alle Datensaetze ausgeben"); printf("\n4 -> Alle Datensaetze speichern"); printf("\n5 -> Alle Datensaetze laden"); printf("\n6 -> Datensatz loeschen"); printf("\n7 -> Alle Datensaetze loeschen"); printf("\n8 -> Programm beenden"); //stürzt ab printf("\n\nBitte waehlen: "); scanf("%d", &selection); fflush(stdin); switch (selection) { case 1: { system("cls"); get_struct(&user[0]); break; } case 2: { system("cls"); print_struct(user[0]); break; } case 3: { system("cls"); printf("number_of_users: %d", number_of_users); //Groesse: 0 ... Wieso? print_whole_struct(user, number_of_users); break; }
Der Rest vom Code ist irrelevant, weil außer case und Klammern nichts steht.
MfG
Navy_Seal209
-
Navy_Seal209 schrieb:
Der Rest vom Code ist irrelevant,
Das kannst du als Anfänger überhaupt nicht beurteilen.
- du gibst die struct Definition nicht an
- du verwendest das Deppen-fflush(stdin)
- du verwendest das Deppen-malloc-Cast
- du definierst Speicher für einen Zeiger auf struct, nicht für structprint_struct(user[0])
kopiert unnötig die ganze struct (Zeiger reicht völlig)
- ich sehe kein free
- ...
-
selection
ist einunsigned char
, Du liest aber einint
. Dabei überschreibst Du teilweisenumber_of_users
.
Ansonsten siehe Wutz.
-
Ok... vielen Dank für die Tipps... Das Problem ist behoben.
-
Das nächste mal bitte https://www.c-plusplus.net/forum/304133 .
#include <assert.h> #include <stddef.h> #include <stdlib.h> #include <stdio.h> typedef struct User_tag { char name[11]; } User; void clear(FILE * input_stream) { int ch; while (((ch = fgetc(input_stream) != EOF) && ch != '\n')); } void get_struct(User * u) { assert(u); scanf("%10s", u->name); } void print_struct(User * u) { assert(u); printf("\"%s\"", u->name); } void print_whole_struct(User * users, size_t number_of_users) { size_t i = 0; assert( users ); for( ; i < number_of_users; ++i) print_struct( user + i ); } int main(void) { User * user = NULL; size_t number_of_users = 0; int choice = 0; user = malloc(sizeof * user); number_of_users++; while (choice != 8) { puts("\n\nWillkommen im Hauptmenue!\n\n1 -> Datensatz eingeben\n2 -> Datensatz ausgeben\n3 -> Alle Datensaetze ausgeben\n4 -> Alle Datensaetze speichern"\ "\n5 -> Alle Datensaetze laden\n6 -> Datensatz loeschen\n7 -> Alle Datensaetze loeschen\n8 -> Programm beenden\n\nBitte waehlen:"); if (scanf("%d", &choice) != 1) clear(stdin); switch (choice) { case 1: get_struct(&user[0]); break; case 2: print_struct(&user[0]); break; case 3: puts("\nUserliste:"); print_whole_struct(user, number_of_users); break; case 8: puts("raus!\n"); break; default: puts("Fehlt noch.\n"); } } }
leckt halt.
-
Caligulaminus schrieb:
selection
ist einunsigned char
, Du liest aber einint
. Dabei überschreibst Du teilweisenumber_of_users
.
Ansonsten siehe Wutz.unsigned int number_of_users = 0;
unsigned char selection = 0;
unsigned char leave = 0;wieso wird nicht leave überschrieben? kann mir jemand erklären in welche Richtung das zu sehen ist? Werden die Variablen nicht nacheinander angelegt, pro neue Zeile im Code?
-
Nichts ist "festgelegt" beim Schreiben in undefinierten Speicher.
Gewöhne dich daran, ausschließlich mit definierten Speicherbereichen zu arbeiten und treffe nicht irgendwelche Annahmen, was ein Compiler wie irgendwie umsetzt.
-
Kurze Frage
user = malloc(sizeof * user);
müsste es nicht user = malloc (sizeof (struct User)) sein ? Hab länger nichts mehr mit C gemacht, ist als Frage gemeint.
Oder gibt hier sizeof *user die Größe der Struct an ?
-
Von welchem Typ ist denn *user? Richtig, User (was eine andere Bezeichnung für struct User_tag ist)
Übrigens ist struct User nirgends definiert