Springen naar inhoud

[c++] pointers


  • Log in om te kunnen reageren

#1

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 22 november 2007 - 18:44

Ik heb net een inleiding gehad in pointers en ik zit een beetje vast bij de eerste oefening:

De opdracht bestaat erin om van een string een c-string te maken en dit via een functie c_str te doen. Nu als ik de c-string laat cout'en dan krijg ik andere letters te zien. Ik vermoed dus dat mijn pointer naar de verkeerde plaats wijst, maar ik zie niet hoe het dan wel moet:

#include <iostream>
using namespace std;

char* c_str(string str) {
	const int SIZE=str.size();
	char t[SIZE+1];
	for (int i=0; i<str.size(); i++) {
		t[i]=str[i];
	}
	t[SIZE]=0;
	char *p= new char;
	p=&t[0];
	return p;
}

int main() {
	string input;
	cout << "String: ";
	cin >> input;
	
	char *p=c_str(input);
	cout << p;
	
	delete p;
	cout << endl << endl;
	system("pause");
	return 0;
}

Veranderd door Cycloon, 22 november 2007 - 18:45


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 22 november 2007 - 23:17

t is een tijdelijke variabele, die bestaat niet meer na de return. En met die p doe je iets raars: p is een char pointer, en door "p = new char" te doen laat je hem pointen naar ÚÚn nieuw in het geheugen gealloceerde char, en vervolgens wijs je aan p het adres toe van de eerste char van t.

Omdat t weer uit het geheugen verdwijnt, wijst ook p naar een ongeldig adres. En naar die ene char die je gealloceerd had wijst niemand meer, dus die is reddeloos verloren.

Wat je moet doen is:
char *t = new char[SIZE+1];
(..alle chars van str kopiŰren naar t, zoals je nu ook al doet..)
t[SIZE]=0;
return t;
Nog een kleine optimalisatie: afhankelijk van beroerd die string.size() functie is ge´mplementeerd zou dit nog nodeloos veel tijd kosten als die string heel erg lang was. Die size heb je al uitgerekend (constante SIZE) dus die kun je net zo goed gebruiken in je for-loop.
In theory, there's no difference between theory and practice. In practice, there is.

#3

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 23 november 2007 - 18:32

Wat je moet doen is:

char *t = new char[SIZE+1];
(..alle chars van str kopiŰren naar t, zoals je nu ook al doet..)
t[SIZE]=0;
return t;


Hmmm, idd. Dom dat ik niet dacht aan het feit dat de t-tabel terug wordt verwijdert nadien.

Nog een kleine optimalisatie: afhankelijk van beroerd die string.size() functie is ge´mplementeerd zou dit nog nodeloos veel tijd kosten als die string heel erg lang was. Die size heb je al uitgerekend (constante SIZE) dus die kun je net zo goed gebruiken in je for-loop.


Idd, dat stukje code had ik maar vlug in mekaar geboxt.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures