[C] Übergebenes array(pointer) auslesen

ang3l

Ensign
Registriert
Okt. 2006
Beiträge
192
hallo zusammen

ich habe das problem dass ich ein übergebenes array(pointer) nicht auslesen kann.

Code:
#include <stdio.h>

int marks[3]	= {4,3,1};

int* countStudentsPerMark() {
	int arrMarkTable[6]	= {0, 0, 0, 0, 0, 0};
	int i	= 0;
	while(i<3) {
		switch(marks[i]) {
		case 1:	arrMarkTable[0]++;
				break;
		case 2:	arrMarkTable[1]++;
				break;
		case 3: arrMarkTable[2]++;
				break;
		case 4: arrMarkTable[3]++;
				break;
		case 5: arrMarkTable[4]++;
				break;
		case 6: arrMarkTable[5]++;
				break;
		}
		i++;
	}
	return arrMarkTable;
}

int main(void) {
	int i	= 0;
	int *arr;
	arr	= countStudentsPerMark();
	while(i<6) {
		printf("<%d>\n", arr[i]);
		i++;
	}
	return 0;
}

ausgegeben wird:
<1>
<2130567168>
<13>
<2686668>
<0>
<2686916>

wenn ich in der methode "countStudentsPerMark" das array ausgebe kommt folgendes raus (was korrekt ist):
<1>
<0>
<1>
<1>
<0>
<0>

ich verstehe nicht was ich falsch mache. hab sehr viel nachgelesen und probiert aber schaffe es einfach nicht :(
 
Du erstellst das Array in einer Fuktion, und nach beenden der Funktion, wird der Speicherplatz des Arrays wieder freigegeben, und anscheinend hast du Pech, werden einzelne Elemente überschieben. Du hast dann zwar einen Pointer, der zeigt aber auf einen freigegebenen Speicherbereich. Du müsstest das Array in der Funktion mit malloc o.Ä. erstellen, damit es auch nach beenden der Funktion nicht überschrieben wird bzw. der Speicherbereich reserviert bleibt.

Innerhalb der Funktion läuft alles wie es soll, d.h. der Speicher für das Array ist normal reserviert und kann nicht von anderen Programmen/Funktionen überschrieben werden. Die Daten bleiben bis zum verlassen der Funktion geschützt.
 
Ich habe in deinem Beispiel mal 2 problematische Stellen rot markiert (und hoffe, daß die Forumsoftware die Markierung nicht wieder verhunzt).

Code:
#include <stdio.h>

int marks[3]	= {4,3,1};

int* countStudentsPerMark() {
	[COLOR="Red"]int arrMarkTable[6]	= {0, 0, 0, 0, 0, 0};[/COLOR]
	int i	= 0;
	while(i<3) {
		switch(marks[i]) {
		case 1:	arrMarkTable[0]++;
				break;
		case 2:	arrMarkTable[1]++;
				break;
		case 3: arrMarkTable[2]++;
				break;
		case 4: arrMarkTable[3]++;
				break;
		case 5: arrMarkTable[4]++;
				break;
		case 6: arrMarkTable[5]++;
				break;
		}
		i++;
	}
	[COLOR="Red"]return arrMarkTable;[/COLOR]
}

Du gibst hier einen Pointer auf eine LOKALE Variable zurück. Ganz schlecht! Denn nachdem die Funktion zum Aufrufer zurückgekehrt ist, existieren alle in ihr angelegten lokalen Variablen nicht mehr. Damit verweist der eben zurückgegebene Pointer nur noch auf "Datenmüll".

EDIT: @And.! ... verdammt! :D
 
besten dank euch zwei!!

lerne c erst seit kurzem und das hatte ich übersehen vor ganzer aufregung mit der array-pointer-geschichte;)
 
Anstatt
Code:
while(i<3) {
    switch(marks[i]) {
        case 1: arrMarkTable[0]++;
            break;
        case 2: arrMarkTable[1]++;
                break;
        case 3: arrMarkTable[2]++;
            break;
        case 4: arrMarkTable[3]++;
            break;
        case 5: arrMarkTable[4]++;
            break;
        case 6: arrMarkTable[5]++;
            break;
    }
i++;
}
sollte auch einfach folgendes gehen:
Code:
while(i<3) {
    arrMarkTable[ marks[i]-1 ]++;
    i++;
}
 
Zurück
Oben