Übergabe von Pointern an Funktionen!

Hauger

Grünschnabel
Hallo,

wenn ich folgenden Aufruf habe:
Code:
char *pszString = NULL;

StringFuellen(pszString);
und die Funktion StringFuellen, mit folgendem Aufbau:
Code:
void StringFuellen(char *pszString)
{
    pszString = new char[10];
   strcpy(pszString, "Test");
}
habe ich nach dem verlassen der Funktion das Problem das mein String nicht mehr existiert, und schon gar nicht den Inhalt Test hat.

Kann mir jemand sagen woran das liegt? Dachte mit dem Operator new wird Speicherplatz auf dem Heap reserviert, und der würde so lange erhlaten bleiben, bis ich den Speicherplatz mit delete wieder frei gebe!

Gruß Jens
 
Hi Jens!

Du machst einen Logikfehler!
Du glaubst deiner Funktion die Adresse auf deinen String zu übergeben, tust du aber nicht! Du übergibst zwar eine Adresse und zwar die des ersten Buchstabens der Zeichenkette und genau das ist ein C-String.

Richtig müsste deine Funktion so lauten:
Code:
void StringFuellen(char **pszString)
{
    *pszString = new char[10];
   strcpy(*pszString, "Test");
}
Der Aufruf entsprechend:
Code:
char *s;
StringFuellen(&s);
Falls dir das zu kompliziert sein sollte, definiere dir doch einfach einen Typ ANSI_STRING:
Code:
typedef char* ANSI_STRING;
So habe ich mir anfangs geholfen etwas komplexere Zeigerstrukturen zu verstehen!

Also dein Programm mit ANSI_STRING:
Code:
typedef char* ANSI_STRING;

ANSI_STRING pszString = NULL;
StringFuellen(&pszString);


void StringFuellen(ANSI_STRING *pszString)
{
    *pszString = new char[10];
   strcpy(*pszString, "Test");
}

Hoffe ich konnte dir helfen!

Johannes
 
Zuletzt bearbeitet:
Alternativ, ohne den doppelten Zeiger:
Code:
void StringFuellen(char* &pszString)
{
   pszString = new char[10];
   strcpy(pszString, "Test");
}
 
Die Alternative von Dudadida funktioniert jedoch nur mit C++ ! Aber dies ist durch new ach schon beschränkt.

Eine Alternative wäre es die Funktion so zu definieren:

Code:
char* StringErstellenUndFuellen(void)
{
   char* pszString = new char[10];
   strcpy(pszString, "Test");
  return pszString;
}
 
Ich stimme zu.

Ich wollte nur mal noch eben anmerken, dass man sich immer überlegen sollte, ob man es wirklich gestattet, dass eine Funktion Speicher alloziert, oder ob man das nicht besser dem User/Client der Funktion überlässt. Das kann nämlich zu einigen unschönen Effekten führen, die verhindert werden, wenn man dem User die Speicherreservierung überlässt.

Wenn man tatsächlich keine Alternative findet (unwahrscheinlich), sollte man eine entsprechende Freigabefunktion zu Verfügung stellen (StringFreigeben() oder so), um sicherzustellen, dass der reservierte Speicher auch auf die richtige Weise freigegeben wird, ohne dass der User diese erraten muss bzw. ohne das er damit behelligt werden muss.

(new, new[], malloc und GlobalAlloc sind nicht kompatibel, und deshalb muss man vermeiden, die falschen Freigabefunktionen (delete, delete[], free und GlobalFree) zu verwenden. )
 
Zurück