[C] Speicherverwaltung

abcd_hallo

Mitglied
Hallo.
Ich stehe gerade voll auf dem Schlauch. Kann mir jemand helfen?

Code:
#include <stdio.h>
#include <malloc.h>

void myfunk(int* test);

int main ()
{
	int *test;

	test = (int*) malloc (sizeof(int));

	myfunk(test);

	for (int i=0; i<10; i++)
		printf("%d\n", test[i]);

	return 0;
}

void myfunk(int* test)
{
	for (int i=0; i<10; i++)
	{
		test = (int*) realloc (test, i+1);

		test[i] = i;
	}
}

Ausgabe:

Code:
-842150656
-842150451
-33698355
65021
4
5
6
7
8
9

Ich benutze MS Visual Studio 6

thx
 
realloc liefert einen neuen pointer zurück. Dieser wird korrekt in deiner testfunktion verwendet - aber nicht nach main zurückgeschrieben.
Du hast also den alten pointer und gibst von dessen Position aus 10 Werte aus. Das kann nicht funktionieren.

Probier mal:

test = myfunc(test);

und ändere myfunc so ab, dass test wieder zurückgeliefert wird.
 
noch eine Idee - realloc erwartet als 2ten Parameter die Größe in byte - eine int ist aber 2 byte lang. Schreib mal

test = (int*) realloc (test, (i+1)*2);

und vergiss free(test) am ende nicht - Speicherlöcher nicht erst angewöhnen. Ausserdem achte darauf, dass test von myfunc zurückgeliefert wird (s.o.)
 
Ähm, wenn ich mich jetzt nicht total irre, kann es aber nur reines Glück sein, dass die Funktion funktioniert, nämlich weil realloc den Anfang des reservierten Speicherbereichs nicht ändert, dürfte es aber prinzipiell tun.
Guckt mal, myfunk erhält einen Zeiger als Wert(!)parameter und ändert die Adresse auf die er zeigt. MyFunk weiß doch gar nicht an welcher Adresse die neue Adresse stehen soll (soll heißen kennt die Adresse von test aus main nicht und kann die mit realloc geholte neue Adresse nicht abspeichern), die Funktion brauch einen Referenzparameter!
 
Zurück