Problem mit Zeigern



  • Hallo!
    Der folgende Code soll einen Benutzer auffordern, anzugeben, wie viele Zahlen er eingeben möchte, aus den eingegebenen Zahlen den Mittelwert berechnen und dann den Mittelwert sowie die Zahlen wieder ausgeben.
    Die Funktion Nutzerabfrage wird dem Anschein nach problemlos ausgeführt, sobald das Programm dann aber wieder zu main zurück springt, sind *zahlen und *offset aber komischer Weise wieder 0.

    Habe ich da irgend etwas übersehen?

    #include <stdio.h>
    #include <stdlib.h>
    
    void Nutzerabfrage(int*, int*, int*);
    void Berechnung(int*, int, int*, int*);
    void Ausgabe(int *, int, int);
    
    int main()
    {
    	int *zahlen=0;
    	int *offset=0;
    	int anzahl;
    	int mittelwert;
    
    	Nutzerabfrage(zahlen, &anzahl, offset);
    	Berechnung(zahlen, anzahl, offset, &mittelwert);
    	Ausgabe(zahlen, anzahl, mittelwert);
    
    	system("pause");
    }
    
    void Nutzerabfrage(int *zahlen, int *anzahl,int *offset)
    {
    
    	int i;
    
    	printf("Wie viele Zahlen moechten Sie eingeben? ");
    	scanf_s("%d", anzahl);
    	fflush(stdin);
    
    	zahlen = (int *)malloc(*anzahl*sizeof(int));
    	offset = zahlen;
    
    	for (i = 0; i < *anzahl; i++)
    	{
    		printf("Bitte die %d. Zahl eingeben: ",i+1);
    		scanf_s("%d", zahlen);
    		fflush(stdin);
    		zahlen++;
    	}
    
    	zahlen = offset;
    
    }
    
    void Berechnung(int *zahlen,int anzahl,int *offset,int *mittelwert)
    {
    	int i;
    	*mittelwert = 0;
    
    	for (i = 0; i < anzahl; i++)
    	{
    		*mittelwert += *zahlen;
    		zahlen++;
    	}
    
    	*mittelwert /= anzahl;
    	zahlen = offset;
    }
    
    void Ausgabe(int *zahlen,int anzahl,int mittelwert)
    {
    	int i;
    
    	printf("Der Mittelwert lautet: %d\n", mittelwert);
    	printf("Die eingegebenen Zahlen lauten:\n");
    
    	for (i = 0; i < anzahl; i++)
    	{
    		printf("%d\n", *zahlen);
    		zahlen++;
    	}
    }
    


  • ralfpeg schrieb:

    Habe ich da irgend etwas übersehen?

    Ja.

    Ein Zeiger ist auch nur eine Variable.

    Wenn du in C den Inhalt einer Variablen aus einer Funktion heraus ändern willst, brauchst du deren Adresse.

    Wenn du einen Zeiger ändern willst, brauchst du einen Zeiger auf diesen Zeiger.
    Oder du gibst den neuen Wert vom Zeiger als Rückgabewert der Funktion zurück.

    offset wird in keinem Fall als Funktionsparameter gebraucht.

    ⚠ Du hast das free vergessen.



  • habs jetzt nach einigem kopfzerbrechen und erinnerung an die zeigerarithmetik geändert. läuft auch alles.

    #include <stdio.h>
    #include <stdlib.h>
    
    int* benutzerabfrage(int*);
    int berechnung(int*,int);
    void ausgabe(int*, int,int);
    
    int main()
    {
    	int *zahlen;
    	int anzahl;
    	int mittelwert;
    
    	zahlen = benutzerabfrage(&anzahl);
    	mittelwert = berechnung(zahlen, anzahl);
    	ausgabe(zahlen, anzahl, mittelwert);
    
    	free(zahlen);
    
    	system("pause");
    }
    
    int* benutzerabfrage(int *anzahl)
    {
    	int i;
    	int *zahlen;
    
    	printf("Wie viele Zahlen moechten Sie eingeben? ");
    	scanf_s("%d", anzahl);
    	fflush(stdin);
    
    	zahlen = (int*)malloc(*anzahl*sizeof(int));
    
    	for (i = 0; i < *anzahl; i++)
    	{
    		printf("Bitte die %d. Zahl eingeben: ",i+1);
    		scanf_s("%d", zahlen+i);
    		fflush(stdin);
    	}
    
    	return zahlen;
    }
    
    int berechnung(int *zahlen, int anzahl)
    {
    	int mittelwert=0;
    	int i;
    
    	for (i = 0; i < anzahl; i++)
    	{
    		mittelwert += *(zahlen + i);
    	}
    
    	mittelwert /= anzahl;
    
    	return mittelwert;
    }
    
    void ausgabe(int *zahlen, int anzahl, int mittelwert)
    {
    	int i;
    
    	printf("Der Mittelwert lautet: %d\n", mittelwert);
    	printf("Die eingegebenen Zahlen lauten:\n");
    
    	for (i = 0; i < anzahl; i++)
    	{
    		printf("%d. Zahl: %d\n", i + 1, *(zahlen + i));
    	}
    }
    


  • Durch das +1 greifst du über den angeforderten Speicher zu.
    Das ist eigentlich nur für den Menschen nötig (beim printf)

    Der Mittelwert von Ganzzahlen kann auch nichganzahlig sein.


Anmelden zum Antworten