dynamische Speicherreservierung

Blender3D

Blender3D

Vitamin C++
[gelöst] dynamische Speicherreservierung

Hallo, Unixboardler!

Ich hab ein kleines Projekt am laufen und muss dafür wissen, wie ich zur Laufzeit ein bestimmtes Array um genau ein Element vergrößern kann.
Z.B. hab ich eine Array A von der Länge 5. Und jetzt möchte ich ohne den Inhalt zu verlieren das Array auf die Größe 6 vergrößern.
Ich hab realloc schon kennen gelern, aber ich hab das kleine problem, dass ich nicht weiß, wie ich zur Laufzeit die Länge des Arrays feststellen kann.
Der Code
Code:
(sizeof(A) / sizeof(A[0]))
liefert leider immer das gleiche Ergebnis (das Selbe, wie sizeof(A[0])).

Damit ihr euch ein Bild von der Lage machen könnt ist hier der gesamte Code:

Code:
#include <iostream>
#include <cstdlib>

class stuff
{
	public:
		int* st;
		stuff();
		~stuff();
		void addToStuff();
};

stuff::stuff()
{
	st = new int[0];
	st[0].a = st[0].b = 10;
}

stuff::~stuff()
{
	delete[] st;
}

void stuff::addToStuff()
{
	int* tmp = (int *) malloc(sizeof(int));
	tmp = (stuff *) realloc(st, /*Hier muss die neue Größe des Arrays ((alte Länge + 1) * sizeof(int)) hinein*/);

	if(tmp != NULL)
	{
		st = tmp;
		tmp = NULL;
	}
	else
	{
		std::cout << "Unable to reallocate Memory" << std::endl;
	}

	delete[] tmp;
}

int main()
{
	stuff S;

	S.addToStuff();

	return 0;
}

Grüße, Blender3D
 
Zuletzt bearbeitet:
Du bist auf den Unterschied zwischen einem Array und einem Pointer, der auf einen zugewiesenen Speicherbereich zeigt, gestossen. Fuer jenen funktioniert 'sizeof(A)/sizeof(A[0])', weil der Speicher bereits zur Kompilierzeit festgelegt ist. Wenn Du Dir klar machst, dass Du in Deinem Programm mit Zeigern arbeitest, verstehst Du auch bald, weswegen 'sizeof(A)/sizeof(A[0])' nicht das Ergebnis liefert, das Du Dir erwuenschst.
In C musst Du meines Wissens nach auch stets die aktuelle Groesse eines Speicherbereichs mituebergeben, bzw. Du musst diese Groesse in der Klasse mitspeichern und mitverwalten. Wenn Du es einfacher und sicherer (!) haben moechtest, dann benutze std::vector statt eines Zeigers.
 
Ok.. Danke. Mit Vektor funktioniert es jetzt.

Grüße, Blender3D
 

Ähnliche Themen

Problem mit Apache2 + MySQL Server

wirre zeichen :(

System V IPC shmat: Permission denied

Xubuntu - AVR32-linux crosscompile sqlite

fußballstatistik auswerten

Zurück
Oben