[c++] pointers

Moderators: jkien, Xilvo

Reageer
Gebruikersavatar
Berichten: 4.810

[c++] pointers

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:

Code: Selecteer alles

#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;

}

Gebruikersavatar
Berichten: 5.679

Re: [c++] pointers

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:

Code: Selecteer alles

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.

Gebruikersavatar
Berichten: 4.810

Re: [c++] pointers

Rogier schreef:Wat je moet doen is:

Code: Selecteer alles

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.

Reageer