Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeiger mit Null initialisieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
23.10.2005, 17:26 Uhr
BT



meine frage ist. wann soll man ein Nicht initialisierte zeiger schreiben wie z.b.:
int *pAge;

und wann sollte man ein zeiger mit Null oder 0 initialisieren wie :

int *pAge=NULL
int *pAge=0

was ist der Unterschied?
danke für jede antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.10.2005, 17:34 Uhr
Spacelord
Hoffnungsloser Fall


Naja,angenommen du hast nen Destruktor der unter anderem Speicher freigeben soll der (eventuell!) von der Klasse belegt wurde dann wirst du da Code reinsetzen der etwa so aussieht:

C++:
if(pAge!=NULL)
     delete pAge;


Wenn du dann pAge nicht mit NULL initialisierst und pAge nicht auf nen gültigen,von dir belegten,Speicherbereich zeigt,dann hast du ein Problem.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.10.2005, 17:59 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von Spacelord:


C++:
if(pAge!=NULL)
     delete pAge;




Ich weiß nicht, warum dieses spezielle Stück Code noch überall auftaucht - Sinn macht es jedenfalls nicht, delete prüft nämlich bereits auf Nullpointer. Das heißt, das Stück Code da oben macht exakt das selbe wie

C++:
delete pAge;


Nur halt langsamer. Ansonsten gilt, in C++ Pointer mit 0, nicht mit NULL initialisieren. NULL ist (void*) 0, so dass strenge Compiler dir

C++:
object *foo = NULL;


nicht abkaufen können, weil void nicht implizit nach object konvertibel ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.10.2005 um 18:01 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.10.2005, 18:07 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von 0xdeadbeef :
Ich weiß nicht, warum dieses spezielle Stück Code noch überall auftaucht ....

Warscheinlich weil es in jedem zweiten C++ Buch so vorgemacht wird .
Legt der Standard fest dass delete auf NULL überprüft ?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.10.2005, 18:57 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


So weit ich weiß ja. Bei free() unter C ist es aber nicht so, d.h. da macht es Sinn vorher zu prüfen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.10.2005, 19:36 Uhr
Pablo
Supertux
(Operator)



Zitat von Guybrush Threepwood:
So weit ich weiß ja. Bei free() unter C ist es aber nicht so, d.h. da macht es Sinn vorher zu prüfen

nein, bei C muss man auch nichts überprüfen:


Zitat:

free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), cal-
loc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is
NULL, no operation is performed.



Ein Pointer mit 0 (nicht mit NULL) zu initialsieren, ist keine gute Idee, da es im Standard niergends gesagt wird, dass NULL der 0 entspricht, sprich NULL muss nicht unbedingt (void*) 0 sein.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 23.10.2005 um 19:38 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.10.2005, 19:57 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


hmm wie kam ich blos auf den Käse?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.10.2005, 20:10 Uhr
0xdeadbeef
Gott
(Operator)


@Pablo: Direkt aus dem C-Standard:

Code:
6.3.2.3.3:
An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant. (...)

7.17:
(...) The macros are
       NULL
which expands to an implementation-defined null pointer constant; and (...)


Sinnerhaltend gekürzt natürlich.

In C++ ist es unklug und möglicherweise illegal (auch wenn es die meisten Compiler erlauben), Pointer mit NULL zu initialisieren, weil halt u.U. der Typ nicht passt. Aus dem Grund wird C++0x wahrscheinlich auch ein nullptr-Keyword für diesen Zweck einführen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.10.2005 um 20:11 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.10.2005, 20:23 Uhr
predator




Zitat von 0xdeadbeef:
Aus dem Grund wird C++0x wahrscheinlich auch ein nullptr-Keyword für diesen Zweck einführen.


C++0x



Was n das?
--
Gruß
predator
Zitat von Edsger W. Dijkstra:
Es ist praktisch unmöglich, einem Studenten gutes Programmieren beizubringen, wenn er vorher in BASIC programmiert hat. Als potenzielle Programmierer sind sie geistig verstümmelt ohne Hoffnung auf Erholung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.10.2005, 20:45 Uhr
Pablo
Supertux
(Operator)


@beffy: hmm... scheint zu stimmen. Ich erinnere mich an eine Diskussion an c-plusplus.de, wobei es genau darum ging, ob NULL === (void *) 0, oder ob der Null pointer auch einen anderen Wert haben darf.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: