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 struct

    • print_struct(user[0]) kopiert unnötig die ganze struct (Zeiger reicht völlig)
      - ich sehe kein free
      - ...


  • selection ist ein unsigned char , Du liest aber ein int . Dabei überschreibst Du teilweise number_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 ein unsigned char , Du liest aber ein int . Dabei überschreibst Du teilweise number_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


Anmelden zum Antworten