<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[NULL und 0]]></title><description><![CDATA[<p>Hi,</p>
<p>ich zoff mich grad mit einem Kumpel, er meint NULL und 0 ist das selbe, ich meine das nicht. Also fragen wir nun die Profis <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ist es das selbe oder nicht?????</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/35499/null-und-0</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 21:48:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/35499.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Mar 2003 21:17:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:17:00 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich zoff mich grad mit einem Kumpel, er meint NULL und 0 ist das selbe, ich meine das nicht. Also fragen wir nun die Profis <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ist es das selbe oder nicht?????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259098</guid><dc:creator><![CDATA[Ikari]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:21:00 GMT]]></title><description><![CDATA[<p>btw.</p>
<pre><code class="language-cpp">#define Kumpel /me
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/259099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259099</guid><dc:creator><![CDATA[Mis2com]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:22:00 GMT]]></title><description><![CDATA[<p>NULL und 0 sind austauschbar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259100</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:23:00 GMT]]></title><description><![CDATA[<p>Das heißt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259101</guid><dc:creator><![CDATA[Mis2com]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:24:00 GMT]]></title><description><![CDATA[<p>Das sollte ausreichen.</p>
<pre><code class="language-cpp">#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif
</code></pre>
<p>In C++ ist NULL == 0, in C ist es ((void *)0)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259103</guid><dc:creator><![CDATA[copy &amp; paster]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:24:00 GMT]]></title><description><![CDATA[<p>gleich definiert oder nicht?</p>
<pre><code class="language-cpp">#define NULL 0
</code></pre>
<p>oder wie ist das Definiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259102</guid><dc:creator><![CDATA[Ikari]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:25:00 GMT]]></title><description><![CDATA[<p>naja. unter C++ is NULL eh nichtmehr empfohlen. 0 genügt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259104</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:25:00 GMT]]></title><description><![CDATA[<p>Kann man auch in C 0 statt NULL schreiben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259105</guid><dc:creator><![CDATA[Mis2com]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 21:35:00 GMT]]></title><description><![CDATA[<p>normal schon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259106</guid><dc:creator><![CDATA[Mr. N]]></dc:creator><pubDate>Sat, 15 Mar 2003 21:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 22:34:00 GMT]]></title><description><![CDATA[<p>Soll man 0 statt NULL verwenden? Ein ganz klares jein. Die untypisierte Umwandlung des C Makros in</p>
<pre><code>((void *) 0)
</code></pre>
<p>nimmt der Übersetzungseinheit Arbeit ab, da (void <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> praktisch ein Synonym für einen Zeiger auf irgendeinen Typ darstellt. Dieses Prinzip widerstrebt aber C++, weshalb hier NULL mit 0 definiert wird. Beide Ausdrücke sind konform entsprechend der Norm (hey das reimt sich) und beschränken die Philosophie von C bzw. C++ in keinster Weise. Persönlich nutze ich generell NULL. Allein schon wegen zwei Gründen. Der erste ist die Anschaulichkeit des Codes. 0 ist nunmal ein Integer (Ganzzahl), ein Zeiger hingegen eine Art Referenz oder Verweis. Zum zweiten ist nicht auf jedem System 0 gleich NULL, zB Prime 50, Honeywell-Bull Mainframes oder CDC-Cyber 80. Um nur mal einige zu nennen. Code wird somit portabler. Ehrlich gesagt fände ich es sogar noch korrekter für die Abfrage eines NULL gültigen Types eine Makro Abfrage bzw. Template Funktion zu nutzen, also:</p>
<pre><code>#define IsNull(x) ... // C
</code></pre>
<pre><code class="language-cpp">template &lt;typename T&gt;
bool IsNull(T x) ...
</code></pre>
<p>Aber ok, man kanns auch übertreiben.<br />
Generell kann man sagen, jeder sollte es so machen wie er/sie es für richtig hält. Unschlüssigen kann ich aber NULL eher empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259107</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 15 Mar 2003 22:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 23:17:00 GMT]]></title><description><![CDATA[<p>hää das stimmt doch gar nicht (meine ich)!<br />
NULL != 0;<br />
macht mal folgendes:</p>
<p>int var1 = 0;<br />
int var2 = NULL;</p>
<p>printf(&quot;%d&quot;, var1);</p>
<p>printf(&quot;%d&quot;, var2);<br />
printf(&quot;%s&quot;, var2); // ACHTUNG</p>
<p>[ Dieser Beitrag wurde am 16.03.2003 um 00:38 Uhr von <strong>Peter Piksa</strong> editiert. ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259108</guid><dc:creator><![CDATA[Peter Piksa]]></dc:creator><pubDate>Sat, 15 Mar 2003 23:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 23:35:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
<strong>ist nicht auf jedem System 0 gleich NULL, zB Prime 50, Honeywell-Bull Mainframes oder CDC-Cyber 80. Um nur mal einige zu nennen. Code wird somit portabler.</strong></p>
</blockquote>
<p>Nein. Sowohl 0 als auch NULL (aber auch 0x0, 0l etc pp) sind im Zeigerkontext Nullzeigerkonstanten, die bei der Zuweisung an einen Zeiger jenen in einen Nullzeiger, was lediglich die C-Terminologie für 'ungültiger Zeiger' ist, verwandeln, unabhängig davon, welche Vorstellungen die C-Implementierung von 'ungültigen Segmenten' hat. Ein einfaches 'define NULL 0' ist _immer_ eine gültige Definition von NULL, verwenden tut sie trotzdem fast keine Implementierung, weil dafür die Leute zu schlecht C können:</p>
<pre><code class="language-cpp">printf(&quot;%p\n&quot;, NULL);
</code></pre>
<p>ist zB ein gerne geschriebenes, absolut falsches Konstrukt, das aber zu keinen Absturz führt, wenn man einen 'void*' oder etwas gleichgroßes übergibt. Es lohnt sich wirklich, mal unter DOS programmiert zu haben ...</p>
<p>Peter Piksa: Wir reden vom Zeigerkontext. Dein Codefetzten ist recht kaputt und kann nichts beweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259109</guid><dc:creator><![CDATA[Daniel E.]]></dc:creator><pubDate>Sat, 15 Mar 2003 23:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sat, 15 Mar 2003 23:39:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von Daniel E.:<br />
<strong>Dein Codefetzten ist recht kaputt und kann nichts beweisen.</strong></p>
</blockquote>
<p>Wieso nicht? Ich denke es ist schon ein Unterschied wenn einmal &quot;0&quot; und einmal &quot;&lt;null&gt;&quot; ausgegeben wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259110</guid><dc:creator><![CDATA[Peter Piksa]]></dc:creator><pubDate>Sat, 15 Mar 2003 23:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 00:00:00 GMT]]></title><description><![CDATA[<p>Das 'Programm' hat undefiniertes Verhalten. Ausgegeben wird hier übrigens ein Compilerfehler. Auch spannend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259111</guid><dc:creator><![CDATA[Daniel E.]]></dc:creator><pubDate>Sun, 16 Mar 2003 00:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 10:04:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von Peter Piksa:<br />
<strong>Ich denke es ist schon ein Unterschied wenn einmal &quot;0&quot; und einmal &quot;&lt;null&gt;&quot; ausgegeben wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> :p</strong></p>
</blockquote>
<p>Lies mal die FAQ - da gibts nen Thread darüber.</p>
<p>Achja: wenn Daniel E. etwas sagt, dann ist das meistens richtig. also hör auf Gurus wie ihn, oder schau einfach in den Headern nach um den Beweis zu finden.</p>
<p>der code von copy &amp; paster ist aus einer beliebigen header datei kopiert (OK, nicht beliebig, da NULL nicht überall definiert wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259112</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 16 Mar 2003 10:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 12:36:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von Shade Of Mine:<br />
<strong>Achja: wenn Daniel E. etwas sagt, dann ist das meistens richtig. also hör auf Gurus wie ihn</strong></p>
</blockquote>
<p>Huch? Ne, ich mache genügend Fehler und bin immer wieder froh, wenn Leute sie finden. Besonders um 1h in der Nacht sollte man mir vielleicht nicht alles glauben ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/259113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259113</guid><dc:creator><![CDATA[Daniel E.]]></dc:creator><pubDate>Sun, 16 Mar 2003 12:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 13:23:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/366">@Peter</a> Piksa</p>
<blockquote>
<p>hää das stimmt doch gar nicht (meine ich)!<br />
NULL != 0;</p>
</blockquote>
<p>Bei NULL hätte ich vielleicht eher Nullzeiger schreiben sollen. Das NULL == 0 im normalen C/C++ Kontext ist will ich ja gar nicht bestreiten. Dies ergibt sich allein schon nach der Auflösung des defines. Dafür brauchst du keinen Code mit printf's um das zu beweisen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/35122">@Daniel</a> E.</p>
<blockquote>
<p>Nein. Sowohl 0 als auch NULL (aber auch 0x0, 0l etc pp) sind im Zeigerkontext Nullzeigerkonstanten, die bei der Zuweisung an einen Zeiger jenen in einen Nullzeiger, was lediglich die C-Terminologie für 'ungültiger Zeiger' ist, verwandeln, unabhängig davon, welche Vorstellungen die C-Implementierung von 'ungültigen Segmenten' hat. Ein einfaches 'define NULL 0' ist _immer_ eine gültige Definition von NULL</p>
</blockquote>
<p>Eben nicht. Welcher *Wert* sich hinter einem Nullzeiger verbirgt ist systemabhängig. Im normalen C/C++ Kontext auf x86 (32/64 Bit) Maschinen mag deine Behauptung zutreffen. Wenn du alleredings ein Programm auf exotische Hardware portierst (siehe mein vorheriger Poll), musst du deinen gesamten Code umschreiben, falls du 0 verwendest hast, da hier ein Nullzeiger jetzt nicht mehr den Wert 0 hat sondern zB 0xB00000000000. Wenn du NULL verwendet hast ist dies kein Problem, da hier lediglich das define angepasst wird. Wie Peter Piksa schon gesagt hat, es ist ein Unterschied ob dann printf &quot;&lt;null&gt;&quot; oder &quot;0xB00000000000&quot; ausgibt.</p>
<blockquote>
<p>printf(&quot;%p\n&quot;, NULL);<br />
ist zB ein gerne geschriebenes, absolut falsches Konstrukt, das aber zu keinen Absturz führt, wenn man einen 'void*' oder etwas gleichgroßes übergibt. Es lohnt sich wirklich, mal unter DOS programmiert zu haben ...</p>
</blockquote>
<p>Wieso soll dies ein *absolut falsches Konstrukt* sein?<br />
Eben wenn du DOS programmiert hast müsstest du ja eigentlich wissen, dass 0 nicht immer ein Nullzeiger ist. Wie du weist gibts unter DOS near und far- Zeiger. Near-Zeiger sind lediglich 16 Bit breit und geben den Segment-Offset an. Wenn also ein solcher Near-Zeiger den Wert 0 hat, muss dies noch lange nicht bedeuten, dass ein Zugriff damit ungültig ist. Solange das Datensegemnt (oder welches Segment auch immer verwendet wird) auf einen gültigen Speicherbereich verweist sind Zugriffe damit OK.</p>
<p>[ Dieser Beitrag wurde am 16.03.2003 um 14:44 Uhr von <strong>groovemaster2002</strong> editiert. ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259114</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 16 Mar 2003 13:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 14:04:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
**Welcher *Wert* sich hinter einem Nullzeiger verbirgt ist systemabhängig<br />
**</p>
</blockquote>
<p>und irrelevant, btw.</p>
<blockquote>
<p>Wenn du alleredings ein Programm auf exotische Hardware portierst (siehe mein vorheriger Poll), musst du deinen gesamten Code umschreiben, falls du 0 verwendest hast, da hier ein Nullzeiger jetzt nicht mehr den Wert 0 hat sondern zB 0xB00000000000.</p>
</blockquote>
<p>Dann würde ich mich schnellstens beim ISO-Komitee beschweren. Die schreiben nämlic in 6.3.2.3p3 (ISO-C) »An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant«. Alles falsch? Krieg' ich dann mein Geld zurück?</p>
<blockquote>
<p>Wenn du NULL verwendet hast ist dies kein Problem, da hier lediglich das define angepasst wird.</p>
</blockquote>
<p>Die Definition von NULL liegt in stdlib.h/cstdlib und auf die hat man keinen Zugriff.</p>
<blockquote>
<blockquote>
<p>printf(&quot;%p\n&quot;, NULL);<br />
Wieso soll dies ein *absolut falsches Konstrukt* sein?</p>
</blockquote>
</blockquote>
<p>Weil zB 'sizeof (int) != sizeof(void*)'. Beim Turbo-C-Compiler hat man je nach Speichermodell NULL auf die passende Größe gesetzt, damit in solchen Situationen (va_args) die Programme nicht abstürzen, obwohl sie falsch sind.</p>
<p>C beschreibt übrigens keine Computer sondern virtuelle Maschinen. Ein Zeiger in C muss überhaupt nicht auf physikalische Adressen im Speicher zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259115</guid><dc:creator><![CDATA[Daniel E.]]></dc:creator><pubDate>Sun, 16 Mar 2003 14:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 14:07:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
<strong>Eben nicht. Welcher *Wert* sich hinter einem Nullzeiger verbirgt ist systemabhängig. Im normalen C/C++ Kontext auf x86 (32/64 Bit) Maschinen mag deine Behauptung zutreffen. Wenn du alleredings ein Programm auf exotische Hardware portierst (siehe mein vorheriger Poll), musst du deinen gesamten Code umschreiben, falls du 0 verwendest hast, da hier ein Nullzeiger jetzt nicht mehr den Wert 0 hat sondern zB 0xB00000000000. Wenn du NULL verwendet hast ist dies kein Problem, da hier lediglich das define angepasst wird. Wie Peter Piksa schon gesagt hat, es ist ein Unterschied ob dann printf &quot;&lt;null&gt;&quot; oder &quot;0xB00000000000&quot; ausgibt.</strong></p>
</blockquote>
<p>darf ich mal den C++ Standard zitieren?</p>
<blockquote>
<p>A null pointer constant is an integral constant expression rvalue of integer type that evaluates to zero.</p>
</blockquote>
<p>Und jetzt erklär mir mal wie 0xB0000 zu 0 werden kann.</p>
<p>Daniel E. hat recht mit seiner Behauptung - der Standard bestätigt es.</p>
<p>0 ist im Zeigerkontext etwas anderes als im nicht-Zeiger Kontext. Denn 0 im Zeigerkontext steht für 'NULL-Zeiger'. Ein 'NULL-Zeiger' muss nicht auf die Addresse 0x0000 zeigen (das ist implementation defined).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259116</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 16 Mar 2003 14:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 15:39:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/35122">@Daniel</a> E:<br />
Was hat<br />
'sizeof (int) != sizeof(void*)'<br />
mit<br />
printf(&quot;%p\n&quot;, NULL);<br />
zu tun. '%p' zeigt an, dass das Argument ein Zeiger ist und NULL ist nunmal ein Synonym für einen Zeiger, nämlich eine Nullzeiger. Wenn printf nicht weiss wie ein Zeiger aussieht bzw. wie man den aus einer Argumentliste rauskriegt ist das doch nicht die Schuld des Programmierers der printf nutzt. Persönlich halte ich es sogar für unclever, dass Funktionen wie printf va_arg benutzen, da hier Argument an int Grenzen festgesetzt werden.<br />
Eigentlich dachte ich das *Gurus* soweit denken könnten, dass man auf exotischen Systemen selbstverständlich eine angepasste Version für Funktionen wie printf braucht, nicht umsonst nutzt zB die C stdlib Makros wie _M_ALPHA etc.</p>
<blockquote>
<p>und irrelevant, btw</p>
</blockquote>
<p>OK, ist deine Meinung und die respektier ich *schleim*. Meine Meinung ist das jedenfalls nicht.</p>
<p>@Shade Of Mine<br />
wenn du meine Polls mal genau durchgelesen hättest, wäre dir aufgefallen, dass ich nicht behaupte, dass NULL != 0 in Standard C/C++ ist. Oder glaubst du auf exotischer Hardware (naja Windows reicht ja als Bsp. eigentlich auch schon) kommst man mit dem Standard immer ans Ziel?</p>
<blockquote>
<p>0 ist im Zeigerkontext etwas anderes als im nicht-Zeiger Kontext. Denn 0 im Zeigerkontext steht für 'NULL-Zeiger'. Ein 'NULL-Zeiger' muss nicht auf die Addresse 0x0000 zeigen (das ist implementation defined).</p>
</blockquote>
<p>Damit bestätigst du vollkommen meine Ansicht. Die Frage war ja auch ob NULL (bei NULL geh ich jedenfalls davon aus, dass jemand damit einen Nullzeiger beschreibt) und 0 dasselbe sind. Betrachtet man nun 0 im Kontext der Abfrage eines Zeigers sage ich ja, im Kontext des Wertes eines Zeigers nein. Wie ein Nullzeiger ausgewertet wird hängt ja schliesslich vom Compiler ab. Denn auf Maschinensprache-Ebene ist es Wurscht ob du nun einen Zeiger oder Integer hast.</p>
<blockquote>
<p>mov eax, 0x00401000</p>
</blockquote>
<p>Wurde nun hier eax ein Zeiger oder ein Integer zugewiesen?</p>
<p>Aber ich will nicht zu weit abdriften. Meine damit nur wer 0 verwenden will, bitteschön, der solls auch tun. Dann kann ers bei Abfragen aber auch ganz weglassen.</p>
<pre><code>if (ptr) ...
if (!ptr) ...
</code></pre>
<p>Ich werde jedenfalls sowohl in C als auch C++ weiterhin NULL verwenden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>[ Dieser Beitrag wurde am 16.03.2003 um 16:53 Uhr von <strong>groovemaster2002</strong> editiert. ]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259117</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 16 Mar 2003 15:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 16:33:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
<em><em>Was hat<br />
'sizeof (int) != sizeof(void</em>)'<br />
mit<br />
printf(&quot;%p\n&quot;, NULL);<br />
zu tun. '%p' zeigt an, dass das Argument ein Zeiger ist</em>*</p>
</blockquote>
<p>Aber nicht zur Compilezeit. Nehmen wir mal wieder ein exotisches System, zB ein solches wo Funktionsparameter auf den Stack gelegt werden. Es wird 'etwas' mit sizeof NULL auf den Stack gelegt, und sizeof (void*) gepopt.</p>
<blockquote>
<p>NULL ist nunmal ein Synonym für einen Zeiger, nämlich eine Nullzeiger.</p>
</blockquote>
<p>Nein, das ist der springende Punkt. NULL ist eine Nullzeigerkonstante, bestimmt kein Nullzeiger. Was NULL im nicht-Zeigerkontext macht ist nicht vorgeschrieben.</p>
<blockquote>
<p>Eigentlich dachte ich das *Gurus* soweit denken könnten, dass man auf exotischen Systemen selbstverständlich eine angepasste Version für Funktionen wie printf braucht, nicht umsonst nutzt zB die C stdlib Makros wie _M_ALPHA etc.</p>
</blockquote>
<p>Was willst Du mit deiner 'angepassten Version von printf' machen? Soll sie die Spezifikation von printf erfüllen? Wer ist _M_ALPHA?</p>
<blockquote>
<p>Denn auf Maschinensprache-Ebene ist es Wurscht ob du nun einen Zeiger oder Integer hast.</p>
</blockquote>
<p>Exotische Systeme: Was ist, wenn für Addressoperationen andere Register benutzt werden als für Integer? Was, wenn ein Zeiger größer ist, als ein Integer?<br />
<a href="http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap1.html" rel="nofollow">http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap1.html</a> sollte alle Fragen zu Nullzeigern klären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259118</guid><dc:creator><![CDATA[Daniel E.]]></dc:creator><pubDate>Sun, 16 Mar 2003 16:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Sun, 16 Mar 2003 16:59:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
**@Shade Of Mine<br />
wenn du meine Polls mal genau durchgelesen hättest, wäre dir aufgefallen, dass ich nicht behaupte, dass NULL != 0 in Standard C/C++ ist. Oder glaubst du auf exotischer Hardware (naja Windows reicht ja als Bsp. eigentlich auch schon) kommst man mit dem Standard immer ans Ziel?<br />
**</p>
</blockquote>
<p>Ja das glaube ich. Nicht umsonst hat Standard C++ große einbußen um auch auf exotischer hardware zu rennen (zB threads, gui, sokcets,...)</p>
<p>Ich hab leider den Standard von eC++ nicht, aber ich denke auch dort gilt in bezug auf 0-zeiger das gleiche.</p>
<p>Zumindest auf mikrokontrollern ist es so (OK, da verwendet mein Vater C, aber dennoch: 0 bleibt immer 0)</p>
<blockquote>
<p>Damit bestätigst du vollkommen meine Ansicht. Die Frage war ja auch ob NULL (bei NULL geh ich jedenfalls davon aus, dass jemand damit einen Nullzeiger beschreibt) und 0 dasselbe sind. Betrachtet man nun 0 im Kontext der Abfrage eines Zeigers sage ich ja, im Kontext des Wertes eines Zeigers nein. Wie ein Nullzeiger ausgewertet wird hängt ja schliesslich vom Compiler ab. Denn auf Maschinensprache-Ebene ist es Wurscht ob du nun einen Zeiger oder Integer hast.</p>
<pre><code>mov eax, 0x00401000
</code></pre>
<p>Wurde nun hier eax ein Zeiger oder ein Integer zugewiesen?<br />
auf exotischer hardware kann ein zeiger größer oder kleiner als ein int sein.<br />
die maschinen ebene ist aber egal für c/c++ programmierer.</p>
<p>ob er aus einem<br />
int* p=0;<br />
ein<br />
mov xxx, 0x0000<br />
oder<br />
mov xxx, 0xgeileaddy<br />
macht ist mir doch egal.<br />
auch wenn p nun nicht auf die adresse 0 zeigt, dann ist p dennoch ein 0-zeiger.<br />
[quote]<br />
Aber ich will nicht zu weit abdriften. Meine damit nur wer 0 verwenden will, bitteschön, der solls auch tun. Dann kann ers bei Abfragen aber auch ganz weglassen.</p>
<pre><code class="language-cpp">if (ptr) ...
if (!ptr) ...
</code></pre>
<p>Ich werde jedenfalls sowohl in C als auch C++ weiterhin NULL verwenden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>verwende NULL - niemand will es dir ausreden.<br />
aber merke:<br />
NULL liefert immer 0, 0L, 0LL oder ähnliches (immer 0)</p>
<p>lies den standard wenn du uns nicht glaubst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259119</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 16 Mar 2003 16:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Mon, 17 Mar 2003 11:31:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/35122">@Daniel</a> E.<br />
Wer sizeof(NULL) als printf Argument und im Formatstring &quot;%p&quot; benutzt der ist irgendwie selbst dran Schuld. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Mit angepasster Version meine ich natürlich, dass man den Source von printf braucht und das ganze nochmal neu compilieren muss für das entsprechende System.</p>
<p>@Shade Of Mine:</p>
<blockquote>
<p>ob er aus einem<br />
int* p=0;<br />
ein<br />
mov xxx, 0x0000<br />
oder<br />
mov xxx, 0xgeileaddy<br />
macht ist mir doch egal.</p>
</blockquote>
<p>(Wusste garnicht dass es g, i, l und y im Hex-Format gibt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> 0xdeadbeef)<br />
Mag dir zwar egal sein, aber nicht Leuten (wie mir), die teilweise Sequenzen in Assembler programmieren (weiss leider net ob Inline Assembler im C++ Standard erlaubt ist). Da ich mir der Problematik bewusst bin, bin deshalb u.a. gerade dabei sämtliche Routinen direkt in Assembler Module zu packen. Obs was bringt weiss ich nicht, da für andere Systeme solche Sachen meist eh neu programmiert werden müssen. Aber allein um C/C++ strikter von Assembler abzugrenzen denke ich ist dies sinnvoller. Weiss allerdings noch nicht was ich mit inline inline Assembler Funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> machen soll.<br />
also</p>
<pre><code class="language-cpp">inline int TuIrgendwas()
{
  __asm {
     ...
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/259120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259120</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 17 Mar 2003 11:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Mon, 17 Mar 2003 19:43:00 GMT]]></title><description><![CDATA[<blockquote>
<p>Original erstellt von groovemaster2002:<br />
**Mit angepasster Version meine ich natürlich, dass man den Source von printf braucht und das ganze nochmal neu compilieren muss für das entsprechende System.<br />
**</p>
</blockquote>
<p>printf wird wohl überall mehr oder weniger gleich aussehen - vorallem das verhalten ist identisch.</p>
<p>sicher braucht man für jedes system ein eigenes printf - aber das ist ja der sinn einer library wie die C/C++ Runtime Library: der programmierer muss sich nicht darum kümmern.</p>
<blockquote>
<p>Mag dir zwar egal sein, aber nicht Leuten (wie mir), die teilweise Sequenzen in Assembler programmieren (weiss leider net ob Inline Assembler im C++ Standard erlaubt ist). Da ich mir der Problematik bewusst bin, bin deshalb u.a. gerade dabei sämtliche Routinen direkt in Assembler Module zu packen. Obs was bringt weiss ich nicht, da für andere Systeme solche Sachen meist eh neu programmiert werden müssen.</p>
</blockquote>
<p>damit begibst du dich sowieso in eine compiler und OS abhängigkeit -&gt; insofern hat das nix im C++ Forum zu suchen.</p>
<p>In C++ braucht man sich nicht um sowas kümmern - und wenn man es doch mal muss, dann ist das sowieso system-spezifisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/259121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/259121</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 17 Mar 2003 19:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Thu, 30 Aug 2007 12:46:47 GMT]]></title><description><![CDATA[<p>Dazu muss man jedoch auch sagen, dass NULL bei Datenbanken nicht das selbe sind wie in C oder C++. Allein schon in den beiden Sprachen gibt es Unterschiede, da das eine nur ein Integer ist und das andere ein richtiger Zeiger auf 0. Wie das jetzt jedoch in Delphi, Java und C# ist weiß ich nicht. Aber in PHP ist null ein Witz der nichts zu sagen hat.</p>
<p>Meine Erfahrung jedenfalls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355336</guid><dc:creator><![CDATA[geeky@work]]></dc:creator><pubDate>Thu, 30 Aug 2007 12:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to NULL und 0 on Thu, 30 Aug 2007 13:02:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/41">@geeky</a>@work<br />
Musst du wirklich Einträge die sehr alt sind neu aufleben lassen (der letzte Eintrag vor deinem ist von 2003!)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1355349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1355349</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 30 Aug 2007 13:02:31 GMT</pubDate></item></channel></rss>