Frage zu Zeiger Funktion
-
Hallo hier wird bei mir immer 124500 ausgeben: ret = sum ( cubed ( v ) ) ;
Kann man überhaupt den Wert 100 ausgeben lassen wenn ich die Zeiger Funktion als Parameter an die Funktion sum übergebe?
#include <iostream> using namespace std; int *cubed( int ); int sum( int *pfun ); int main() { int ret; int v = 100; ret = sum ( &v ); // gibt 100 aus cout<< ret <<endl; ret = sum ( cubed ( v ) ) ; // gibt 124500 aus cout<< ret <<endl; system("PAUSE"); } int sum( int *pfun ) { cout<<"pfun: " << *pfun << endl; // gibt 124500 aus return *pfun; } int *cubed(int x) { cout<<"cubed: " << x << endl; // gibt 100 aus return &x; }
-
Herzlichen Glückwunsch! Sie haben ein Programm mit "undefiniertem Verhalten":
int *cubed(int x) { cout<<"cubed: " << x << endl; // gibt 100 aus return &x; }Nach Beendigen der Funktion, hört x (ist ja nur eine lokale auomatische Kopie) auf zu existieren und damit zeigt ist der zurückgegebene Zeiger ungültig.
Undefiniertes Verhalten --> Du kannst überhaupt gar keine Aussage über das Programm machen. Es könnte Dir den Rechner explodieren lassen, eine Pizza bestellen, oder sonst was.
-
Aber wie macht man es dann richtig ?
-
Ich hab es jetzt so gemacht aber geht das nicht auch anders?
#include <iostream> using namespace std; int *cubed( int ); int sum( int *pfun ); int main() { int ret; int v = 100; ret = sum ( &v ); // gibt 100 aus cout<< ret <<endl; ret = sum ( cubed ( v ) ) ; cout<< ret <<endl; // gibt 100 aus system("PAUSE"); } int sum( int *pfun ) { return *pfun; } int *cubed( int x) { static q; q = x; cout<<"cubed: " << x << endl; // gibt 100 aus return &q; }
-
bob! schrieb:
Aber wie macht man es dann richtig ?
Ohne weitere Infos über das, was Du eigentlich machen willst, hört sich diese Frage so an wie ein "Wie schieße ich mir in den Fuß, ohne mir in den Fuß zu schießen?"
k
-
So würde ich es machen:
Habe keinen Compiler zur Hand, ich hoffe es compiled und tut so

#include <iostream> #include <vector> #include <math.h> // gibts da auch einen ohne .h? cmath ist doch for c? using namespace std; vector<int*> garbage; // entweder, nimm nen pointer, kopier dessen value in nen neuen pointer (garbageCollect nicht vergessen -> jedes new braucht n delete) und return den neuen pointer int* cubed1(int * x) { int * a = new int(*x); garbage.push_back(a); *a *= int(pow(*a,3)); cout<<"cubed: " << a << endl; return a; } // oder nimm den pointer, veränder den Wert in place und return einen dereferenzierten pointer (d.h. intern mach ne kopie und returnier die) int cubed2(int * x) { *x = int(pow(*x,3)); cout<<"cubed: " << *x << endl; return *x; } // oder nimm ne ref, änder den Wert in place und return wieder ne Kopie ... int cubed3(int & x) { x = int(pow(x,3)); cout<<"cubed: " << x << endl; return x; } int main() { int ret; int v = 100; int * pV = &v; cout << cubed1(&v) << endl; cout << cubed2(pV) << endl; cout << cubed3(v) << endl; int s = garbage.size(); for (int i=0;i < s; --s) // mhh, geht das? { delete garbage.end(); garbage.pop_back(); } system("PAUSE"); }
-
bob! schrieb:
Hallo hier wird bei mir immer 124500 ausgeben: ret = sum ( cubed ( v ) ) ;
Kann man überhaupt den Wert 100 ausgeben lassen wenn ich die Zeiger Funktion als Parameter an die Funktion sum übergebe?
Lass doch einfach mal den Optimierer laufen, dann kommt das dabei heraus:
#include <iostream> int main( void ) { std:cout << 100; return 0; }mfg Martin