<?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[Anfänger Problem - Zeiger]]></title><description><![CDATA[<p>Hey...<br />
ich bin noch ein Anfänger und hoffe ihr könnt mir helfen.<br />
Ich habe eine einfache Kundenklasse. Der Vor und Nachname müssen leider Chararrays sein (Aufgabe) und dann noch eine Kundennummer.</p>
<p>Es funktioniert alles perfekt. Die Setter und die Ausgabe.</p>
<p>Danach mache ich das &quot;delete k&quot; und printe k nochmal aus. (Klar geht nicht - aber er müsste dann &quot;Kundendaten ungültig&quot; ausgeben.<br />
Tut er aber nicht. Es kommt zu einer Unbehandelten Ausnahme bei 0x5c5bd51.... Zugriffsverletzung beim Lesen an Position 0xfeeefeee</p>
<p>Habe mit dem Debugger beim 2. Print reingeschaut und gesehen, das die Kundennummer irgendein Wert hat (4277075694) und vor und nachname &quot;0xfeeefeee &lt;schlechtes Ptr&gt;</p>
<p>Warum? Im Destruktor mache ich doch alles auf 0 und NULL... ?!</p>
<p>Bitte um hilfe -.-</p>
<pre><code class="language-cpp">// KUNDE.CPP
Kunde::Kunde(char *vname, char *nname, int knr)
{
	setVorname(vname);
	setNachname(nname);
	setKundennummer(knr);
}

Kunde::Kunde(const Kunde &amp;k)
{
	kundennummer = k.kundennummer;
	setVorname(k.vorname);
	setNachname(k.nachname);
}

Kunde::~Kunde()
{
	cout &lt;&lt; &quot;Destruktor -- Kunde wird entfernt.&quot; &lt;&lt; endl;
	delete [] vorname;
	vorname = NULL;
	delete [] nachname;
	nachname = NULL;
	nachname = 0;
	kundennummer = 0;
}

void Kunde::setKundennummer(int knr)
{
	kundennummer = knr;
}

void Kunde::setVorname(char *vname)
{
	if( vname != NULL )
	{
		if( vorname != NULL )
		{
			delete [] vorname;
			vorname = NULL;
		}
		vorname = new char[strlen(vname)+1];
		strcpy(vorname, vname);
	}
}

void Kunde::setNachname(char *nname)
{
	if( nname != NULL )
	{
		if( nachname != NULL )
		{
			delete [] nachname;
			nachname = NULL;
		}
		nachname = new char[strlen(nname)+1];
		strcpy(nachname, nname);
	}
}

void Kunde::print()
{
	if( vorname != NULL  &amp;&amp;  nachname != NULL )
	{
		cout &lt;&lt; &quot;Kundeninformationen: &quot; &lt;&lt; endl;
		cout &lt;&lt; &quot;Vorname: &quot; &lt;&lt; vorname &lt;&lt; endl;
		cout &lt;&lt; &quot;Nachname: &quot; &lt;&lt; nachname &lt;&lt; endl;
		cout &lt;&lt; &quot;Kundennummer: &quot; &lt;&lt; kundennummer &lt;&lt; endl;
	}
	else
	{
		cout &lt;&lt; &quot;Kundendaten ungueltig!&quot; &lt;&lt; endl;
	}
}
</code></pre>
<pre><code class="language-cpp">// MAIN
Kunde *k = new Kunde();
	k-&gt;setKundennummer(1);
	k-&gt;setNachname(&quot;kk nachname&quot;);
	k-&gt;setVorname(&quot;kk vorname&quot;);
	k-&gt;print();
	delete k;
	k-&gt;print();
</code></pre>
<pre><code class="language-cpp">// KUNDE.H
class Kunde
{

	public:
		Kunde() : kundennummer(0), vorname(NULL), nachname(NULL) {};
		Kunde(char *vname, char *nname, int knr);
		Kunde(const Kunde &amp;k);
		~Kunde();
		void setKundennummer(int knr);
		void setVorname(char *vname);
		void setNachname(char *nname);

		void print();

	private:
		unsigned int kundennummer;
		char *vorname;
		char *nachname;

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/280796/anfänger-problem-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 00:21:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280796.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Jan 2011 18:25:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:25:10 GMT]]></title><description><![CDATA[<p>Hey...<br />
ich bin noch ein Anfänger und hoffe ihr könnt mir helfen.<br />
Ich habe eine einfache Kundenklasse. Der Vor und Nachname müssen leider Chararrays sein (Aufgabe) und dann noch eine Kundennummer.</p>
<p>Es funktioniert alles perfekt. Die Setter und die Ausgabe.</p>
<p>Danach mache ich das &quot;delete k&quot; und printe k nochmal aus. (Klar geht nicht - aber er müsste dann &quot;Kundendaten ungültig&quot; ausgeben.<br />
Tut er aber nicht. Es kommt zu einer Unbehandelten Ausnahme bei 0x5c5bd51.... Zugriffsverletzung beim Lesen an Position 0xfeeefeee</p>
<p>Habe mit dem Debugger beim 2. Print reingeschaut und gesehen, das die Kundennummer irgendein Wert hat (4277075694) und vor und nachname &quot;0xfeeefeee &lt;schlechtes Ptr&gt;</p>
<p>Warum? Im Destruktor mache ich doch alles auf 0 und NULL... ?!</p>
<p>Bitte um hilfe -.-</p>
<pre><code class="language-cpp">// KUNDE.CPP
Kunde::Kunde(char *vname, char *nname, int knr)
{
	setVorname(vname);
	setNachname(nname);
	setKundennummer(knr);
}

Kunde::Kunde(const Kunde &amp;k)
{
	kundennummer = k.kundennummer;
	setVorname(k.vorname);
	setNachname(k.nachname);
}

Kunde::~Kunde()
{
	cout &lt;&lt; &quot;Destruktor -- Kunde wird entfernt.&quot; &lt;&lt; endl;
	delete [] vorname;
	vorname = NULL;
	delete [] nachname;
	nachname = NULL;
	nachname = 0;
	kundennummer = 0;
}

void Kunde::setKundennummer(int knr)
{
	kundennummer = knr;
}

void Kunde::setVorname(char *vname)
{
	if( vname != NULL )
	{
		if( vorname != NULL )
		{
			delete [] vorname;
			vorname = NULL;
		}
		vorname = new char[strlen(vname)+1];
		strcpy(vorname, vname);
	}
}

void Kunde::setNachname(char *nname)
{
	if( nname != NULL )
	{
		if( nachname != NULL )
		{
			delete [] nachname;
			nachname = NULL;
		}
		nachname = new char[strlen(nname)+1];
		strcpy(nachname, nname);
	}
}

void Kunde::print()
{
	if( vorname != NULL  &amp;&amp;  nachname != NULL )
	{
		cout &lt;&lt; &quot;Kundeninformationen: &quot; &lt;&lt; endl;
		cout &lt;&lt; &quot;Vorname: &quot; &lt;&lt; vorname &lt;&lt; endl;
		cout &lt;&lt; &quot;Nachname: &quot; &lt;&lt; nachname &lt;&lt; endl;
		cout &lt;&lt; &quot;Kundennummer: &quot; &lt;&lt; kundennummer &lt;&lt; endl;
	}
	else
	{
		cout &lt;&lt; &quot;Kundendaten ungueltig!&quot; &lt;&lt; endl;
	}
}
</code></pre>
<pre><code class="language-cpp">// MAIN
Kunde *k = new Kunde();
	k-&gt;setKundennummer(1);
	k-&gt;setNachname(&quot;kk nachname&quot;);
	k-&gt;setVorname(&quot;kk vorname&quot;);
	k-&gt;print();
	delete k;
	k-&gt;print();
</code></pre>
<pre><code class="language-cpp">// KUNDE.H
class Kunde
{

	public:
		Kunde() : kundennummer(0), vorname(NULL), nachname(NULL) {};
		Kunde(char *vname, char *nname, int knr);
		Kunde(const Kunde &amp;k);
		~Kunde();
		void setKundennummer(int knr);
		void setVorname(char *vname);
		void setNachname(char *nname);

		void print();

	private:
		unsigned int kundennummer;
		char *vorname;
		char *nachname;

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2009871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009871</guid><dc:creator><![CDATA[shwN]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:28:02 GMT]]></title><description><![CDATA[<p>Du darfst auf ein gelöschtes Objekt nicht mehr zugreifen. Nachdem du delete aufrufst, wird der Destruktor deines Objekts aufgerufen und dein Objekt zerstört, sowie der Speicher freigegeben. Alles, was du danach versuchst, mit dem &quot;Objekt&quot; zu machen erzeugt undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009872</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:33:36 GMT]]></title><description><![CDATA[<p>Aber ich setzte extra den Zeiger nochmal auf NULL.</p>
<p>Kann ich ihn dann bzw. darf ich ihn dann trotzdem nicht mehr ansprechen?</p>
<p>UND</p>
<p>Gerade sehe ich das mein CopyKonstruktor auch nicht funktioniert. Selbes Problem....... verstehe ich nicht..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009877</guid><dc:creator><![CDATA[shwN]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:41:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Kunde* k = new Kunde;
delete k;
// Ab hier darfst du mit k nichts mehr machen!
k-&gt;something(); // Peng!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2009882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009882</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:45:03 GMT]]></title><description><![CDATA[<p>shwN schrieb:</p>
<blockquote>
<p>Aber ich setzte extra den Zeiger nochmal auf NULL.</p>
<p>Kann ich ihn dann bzw. darf ich ihn dann trotzdem nicht mehr ansprechen?</p>
<p>UND</p>
<p>Gerade sehe ich das mein CopyKonstruktor auch nicht funktioniert. Selbes Problem....... verstehe ich nicht..</p>
</blockquote>
<p>A) Ja darfst Du. Es erzeugt aber ein undefiniertes verhalten. Fazit: Nicht machen!<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> Das gleiche !</p>
<p>grüüüße<br />
----------------------------------</p>
<p>Vereinfachtes problem:</p>
<pre><code class="language-cpp">int* i=0;
*i=1; //uuups
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2009883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009883</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:45:03 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:44:19 GMT]]></title><description><![CDATA[<p>Ich vermute, dass</p>
<pre><code class="language-cpp">delete k;
</code></pre>
<p>in deinem Fall nicht nur den Speicher freigibt, sondern ihn vorher auch mit einem einfach erkennbaren Muster überschreibt (0xfeeefeee), um undefiniertes Verhalten dieser Art möglichst sofort aufzudecken. MSVC, von dem ich aufgrund der Meldung des Debuggers vermute, dass du ihn benutzt, macht so was im Debug-Modus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009886</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:44:33 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten.</p>
<p>Aber wieso erzeugt dieser Code das selbe...</p>
<pre><code class="language-cpp">// Main
	Kunde *kk = new Kunde(&quot;kk vorname&quot;, &quot;kk nachname&quot;, 2);
	kk-&gt;print();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2009887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009887</guid><dc:creator><![CDATA[shwN]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:44:33 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:52:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Kunde::setVorname(char *vname)
{
    if( vname != NULL )
    {
        if( vorname != NULL )
        {
            delete [] vorname;
            vorname = NULL;
        }
        vorname = new char[strlen(vname)+1];
        strcpy(vorname, vname);
    }
}
</code></pre>
<p>Das ist der Setter wo er rausspringt.<br />
Habe beim debuggen gesehen das vorname nicht NULL ist sondern dieser komische Wert. Und dann beim delete fliegt er natürlich raus.</p>
<p>Das hier ist aber so gemeint... if vorname != NULL... wenn z.B. schon MustermannMax drinsteht etc. dann erst löschen und dann neu anlegen...</p>
<p>???</p>
<p>Bitte um hilfe...<br />
Und danke für hilfe ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009892</guid><dc:creator><![CDATA[shwN]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:54:44 GMT]]></title><description><![CDATA[<p>Weil du im Ctor deiner variablen nicht initialisierst,...</p>
<pre><code class="language-cpp">//Kunde.h
class Kunde
{
    public:
        Kunde() ;
        Kunde(char *vname, char *nname, int knr);
        Kunde(const Kunde &amp;k);
        ~Kunde();
        void setKundennummer(int knr);
        void setVorname(char *vname);
        void setNachname(char *nname);

        void print();

    private:
        unsigned int kundennummer;
        char *vorname;
        char *nachname;

};
</code></pre>
<pre><code class="language-cpp">//kunde.cpp
Kunde::Kunde(): kundennummer(0), vorname(NULL), nachname(NULL) {};

Kunde::Kunde(char *vname, char *nname, int knr): kundennummer(0), vorname(NULL), nachname(NULL) 
{
    setVorname(vname);
    setNachname(nname);
    setKundennummer(knr);
}

Kunde::Kunde(const Kunde &amp;k): kundennummer(0), vorname(NULL), nachname(NULL)
{
    kundennummer = k.kundennummer;
    setVorname(k.vorname);
    setNachname(k.nachname);
}
</code></pre>
<p>grüüüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009893</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 18:55:57 GMT]]></title><description><![CDATA[<p>Gewöhnt euch an, 0 (oder in C++0x nullptr) zu verwenden. Das hier ist C++, nicht C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009895</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 21 Jan 2011 18:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 19:01:59 GMT]]></title><description><![CDATA[<p>JAAAAAAAAAAAAAAAAAAAAAA</p>
<p>danke.. ^^</p>
<p>das war es echt... ich wär da nie drauf gekommen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009903</guid><dc:creator><![CDATA[shwN]]></dc:creator><pubDate>Fri, 21 Jan 2011 19:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 19:14:01 GMT]]></title><description><![CDATA[<p>MSDN schrieb:</p>
<blockquote>
<p>nullptr is only valid when compiling with /clr (Common Language Runtime Compilation).</p>
</blockquote>
<p>Ich behaupte mal jetzt nicht NULL ist 0, dafür bekomme ich bestimmt<br />
einen auf den deckel.</p>
<p>Aber ich vermute mal, dass es mir eigentlich völlig schnuppe sein kann,...<br />
..gerade weil alle zeiger auf dem gleichen system die gleiche breite haben....</p>
<pre><code class="language-cpp">//bei der gleichen addressbreite wird beides gleich behandelt
#define NULL 0
__int64 *pi64=NULL;
__int32 *pi32=NULL;

__int64 *pi64_2=0;
__int32 *pi32_2=0;

//hier dann nicht mehr, aber die interpretation von null über den 
//zuweisungsoperator einer constanten wird der richtige typ vom compiler gewählt
__int64 i64=NULL;
__int32 i32=NULL;

__int64 i64_2=0;
__int32 i32_2=0;
</code></pre>
<p>das kann man hier schon sehen:</p>
<pre><code class="language-asm">//bei der gleichen addressbreite wird beides gleich behandelt
#define NULL 0
__int64 *pi64=NULL;
0041158D  mov         dword ptr [ebp-14h],0 
__int32 *pi32=NULL;
00411594  mov         dword ptr [ebp-20h],0 

__int64 *pi64_2=0;
0041159B  mov         dword ptr [ebp-2Ch],0 
__int32 *pi32_2=0;
004115A2  mov         dword ptr [ebp-38h],0 

//hier dann nicht mehr, aber die interpretation von null über den 
//zuweisungsoperator einer constanten wird der richtige typ vom compiler gewählt
__int64 i64=NULL;
004115A9  mov         dword ptr [ebp-48h],0 
004115B0  mov         dword ptr [ebp-44h],0 
__int32 i32=NULL;
004115B7  mov         dword ptr [ebp-54h],0 

__int64 i64_2=0;
004115BE  mov         dword ptr [ebp-64h],0 
004115C5  mov         dword ptr [ebp-60h],0 
__int32 i32_2=0;
004115CC  mov         dword ptr [ebp-70h],0
</code></pre>
<p>grüüüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009915</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 21 Jan 2011 19:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 19:19:29 GMT]]></title><description><![CDATA[<ol>
<li>nullptr ist ein Schlüsselwort in C++0x und hat genau den Zweck, kann aber keinem int, char, etc zugewiesen werden, ist also nicht castbar nach nicht-pointer Typen.<br />
Beispiel:</li>
</ol>
<pre><code class="language-cpp">void f(int);
void f(int*);

int main()
{
	f(nullptr); // OK
	f(0);       // Welche Funktion aufrufen?
	f(NULL);    // - || -
}
</code></pre>
<ol start="2">
<li>NULL ist unleserlich.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2009917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009917</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 21 Jan 2011 19:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Fri, 21 Jan 2011 19:40:49 GMT]]></title><description><![CDATA[<p>Hi Pi E+014,</p>
<p><strong>A)</strong> nutzt man einen MSVC Compiler, so ist <em>nullptr</em> nur mit dem flag <em>/clr</em> verfügbar<br />
(Ich progge nativ...)</p>
<p><strong><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /></strong> <em>0</em> wird in deinem beispiel als ein <em>int</em> interpretiert, und nicht als <em>0</em> zeiger</p>
<p><strong>C)</strong><br />
<em>nullptr</em> heißt &quot; null pointer&quot; , also &quot;nullptr indicates that an object handle,<br />
interior pointer, or native pointer type does not point to an object&quot;<br />
und damit wird <em>foo(int</em>)* aufgerufen, ein äquivalent zu <em>foo((int</em>)0)*.</p>
<p>Dadurch wird n bisschen was erleichtert und <em>nullptr</em> ist ja denn auch gehighlighted.<br />
Da gebe ich Dir recht.</p>
<p>D) naja,.. das <em>NULL</em> unleserlich ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>grüüüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009943</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Fri, 21 Jan 2011 19:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 06:39:08 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p><strong><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /></strong> <em>0</em> wird in deinem beispiel als ein <em>int</em> interpretiert, und nicht als <em>0</em> zeiger</p>
</blockquote>
<p>Das Beispiel war falsch, sorry.<br />
Richtig:</p>
<pre><code class="language-cpp">void f(long);
void f(int*);

...

f(NULL);
f(0);
f(nullptr);
</code></pre>
<p>zeusosc schrieb:</p>
<blockquote>
<p><strong>C)</strong><br />
<em>nullptr</em> heißt &quot; null pointer&quot; , also &quot;nullptr indicates that an object handle,<br />
interior pointer, or native pointer type does not point to an object&quot;<br />
und damit wird <em>foo(int</em>)* aufgerufen, ein äquivalent zu <em>foo((int</em>)0)*.</p>
</blockquote>
<p>Habe nie was anderes behauptet.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>D) naja,.. das <em>NULL</em> unleserlich ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Wie ich schon irgendwo geschrieben hab, NULL ist aus C und bleibt am besten dort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009947</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 22 Jan 2011 06:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 06:39:44 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Das Beispiel war falsch, sorry.<br />
Richtig:</p>
<pre><code class="language-cpp">void f(long);
void f(int*);

...

f(NULL);
f(0);
f(nullptr);
</code></pre>
</blockquote>
<p>Jo gutes beispiel.</p>
<p>grüüüüße <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009949</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Sat, 22 Jan 2011 06:39:44 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 01:38:02 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>NULL ist unleserlich.</li>
</ol>
</blockquote>
<p>So ein Quatsch. NULL ist für Zeiger natürlich leserlicher als 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010023</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Sat, 22 Jan 2011 01:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 06:41:40 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<ol start="2">
<li>NULL ist unleserlich.</li>
</ol>
</blockquote>
<p>So ein Quatsch. NULL ist für Zeiger natürlich leserlicher als 0.</p>
</blockquote>
<p>NULL muss vor allem nicht 0 sein und das ist in C++ ein wichtiger Unterschied. Deshalb sollte man 0 nehmen, wenn man 0 meint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010036</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 22 Jan 2011 06:41:40 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 07:42:45 GMT]]></title><description><![CDATA[<p>shwN schrieb:</p>
<blockquote>
<p>Hey...<br />
ich bin noch ein Anfänger und hoffe ihr könnt mir helfen.<br />
Ich habe eine einfache Kundenklasse. Der Vor und Nachname müssen leider Chararrays sein (Aufgabe) und dann noch eine Kundennummer.<br />
...</p>
<pre><code class="language-cpp">// KUNDE.CPP
Kunde::Kunde(char *vname, char *nname, int knr)
{
	setVorname(vname);
	setNachname(nname);
	setKundennummer(knr);
}

Kunde::Kunde(const Kunde &amp;k)
{
	kundennummer = k.kundennummer;
	setVorname(k.vorname);
	setNachname(k.nachname);
}

Kunde::~Kunde()
{
	cout &lt;&lt; &quot;Destruktor -- Kunde wird entfernt.&quot; &lt;&lt; endl;
	delete [] vorname;
	vorname = NULL;
	delete [] nachname;
	nachname = NULL;
	nachname = 0;
	kundennummer = 0;
}

void Kunde::setKundennummer(int knr)
{
	kundennummer = knr;
}

void Kunde::setVorname(char *vname)
{
	if( vname != NULL )
	{
		if( vorname != NULL )
		{
			delete [] vorname;
			vorname = NULL;
		}
		vorname = new char[strlen(vname)+1];
		strcpy(vorname, vname);
	}
}

void Kunde::setNachname(char *nname)
{
	if( nname != NULL )
	{
		if( nachname != NULL )
		{
			delete [] nachname;
			nachname = NULL;
		}
		nachname = new char[strlen(nname)+1];
		strcpy(nachname, nname);
	}
}

void Kunde::print()
{
	if( vorname != NULL  &amp;&amp;  nachname != NULL )
	{
		cout &lt;&lt; &quot;Kundeninformationen: &quot; &lt;&lt; endl;
		cout &lt;&lt; &quot;Vorname: &quot; &lt;&lt; vorname &lt;&lt; endl;
		cout &lt;&lt; &quot;Nachname: &quot; &lt;&lt; nachname &lt;&lt; endl;
		cout &lt;&lt; &quot;Kundennummer: &quot; &lt;&lt; kundennummer &lt;&lt; endl;
	}
	else
	{
		cout &lt;&lt; &quot;Kundendaten ungueltig!&quot; &lt;&lt; endl;
	}
}
</code></pre>
<pre><code class="language-cpp">// KUNDE.H
class Kunde
{

	public:
		Kunde() : kundennummer(0), vorname(NULL), nachname(NULL) {};
		Kunde(char *vname, char *nname, int knr);
		Kunde(const Kunde &amp;k);
		~Kunde();
		void setKundennummer(int knr);
		void setVorname(char *vname);
		void setNachname(char *nname);

		void print();

	private:
		unsigned int kundennummer;
		char *vorname;
		char *nachname;

};
</code></pre>
</blockquote>
<p>Bist Du Dir sicher, dass die Klasse so aussehen soll? Ich kann's nämlich nicht ganz glauben. Die einzige Erklärung, es so zu machen, wäre höchstens zu Lehrzwecken als Negativbeispiel ... mit dem Ziel der Wertschätzung von std::string. Wenn nämlich char* sich nicht so verhält, wie Du es gerne hättest, dann macht es mehr Sinn einen eigenen Typen für diese Datenelemente zu konstruieren (std::string) statt die Kopiersemantik in der Klasse Kunde anzupassen.</p>
<p>Steht in der Aufgabenstellung nur &quot;char Array&quot; oder auch was davon, dass Du Zeiger speichern sollst und den Speicher dynamisch allozieren sollst? Alternativ könnte man nämlich Arrays mit fixer Länge als Datenelemente verwenden. Das ist zumindest ein populärer Ansatz; denn so (mit char*) musst Du Deiner Klasse entsprechende Operationen selbst definieren (den Zuweisungsoperator hast Du übrigens vergessen).</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010043</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 22 Jan 2011 07:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 10:56:59 GMT]]></title><description><![CDATA[<p>zeusosc schrieb:</p>
<blockquote>
<p>..gerade weil alle zeiger auf dem gleichen system die gleiche breite haben....</p>
</blockquote>
<p>Eine solche Garantie macht der C++ Standard nicht, auch nicht, wenn man sich auf &quot;Objekt-Zeiger&quot; beschränkt und Member-Pointer sowie Funktionszeiger außen vor lässt. Es soll Maschinen geben, bei denen 1=sizeof(int*)&lt;sizeof(char*) gilt.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//bei der gleichen addressbreite wird beides gleich behandelt
#define NULL 0
__int64 *pi64=NULL;
__int32 *pi32=NULL;

__int64 *pi64_2=0;
__int32 *pi32_2=0;

//hier dann nicht mehr, aber die interpretation von null über den 
//zuweisungsoperator einer constanten wird der richtige typ vom compiler gewählt
__int64 i64=NULL;
__int32 i32=NULL;

__int64 i64_2=0;
__int32 i32_2=0;
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
btw: Hier gibt es keine Zuweisungen. Das sind Initialisierungen. Der Unterschied: Bei einer Zuweisung gibt es das Ziel-Objekt schon vorher.</p>
<p>zeusosc schrieb:</p>
<blockquote>
<p>das kann man hier schon sehen:</p>
<pre><code class="language-asm">...
</code></pre>
</blockquote>
<p>Ich verstehe nicht Deine Obsession bzgl Implementierungsdetails des Compilers von Microsoft.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010079</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 22 Jan 2011 10:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Anfänger Problem - Zeiger on Sat, 22 Jan 2011 12:57:04 GMT]]></title><description><![CDATA[<p>Ok,... heute ist Samstag,.. heute ist Senftag <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="😃"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>zeusosc schrieb:</p>
<blockquote>
<p>..gerade weil alle zeiger auf dem gleichen system die gleiche breite haben....</p>
</blockquote>
<p>Eine solche Garantie macht der C++ Standard nicht, auch nicht, wenn man sich<br />
auf &quot;Objekt-Zeiger&quot; beschränkt und Member-Pointer sowie Funktionszeiger außen<br />
vor lässt. Es soll Maschinen geben, bei denen 1=sizeof(int*)&lt;sizeof(char*) gilt.</p>
</blockquote>
<p>Echt? Das garantiert mir vlt. nicht die ISO, aber es garantiert mir die<br />
architektur die ich mit meinen source versorge.<br />
Auf einem 32bit system der x86 architektur ist die addresse immer 32bit breit,<br />
wohingegen 8bit systeme der RISC architektur auch 16bit breite addressen<br />
unterstützen (müssen) da der stack oft größer als 256 Byte Ram ist,<br />
aber selbst dort ist jeder 16bit offset ptr als low und high fragment nur<br />
jeweils 8bit groß.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>btw: Hier gibt es keine Zuweisungen. Das sind Initialisierungen. Der Unterschied: Bei einer Zuweisung gibt es das Ziel-Objekt schon vorher.</p>
</blockquote>
<p>Ja, das object existiert ja auch schon vorher.</p>
<pre><code class="language-cpp">double a(1.0f);
double b=1.0f;
double c;
c=1.0f;
</code></pre>
<p>sind 100% äquivalent.</p>
<p>Das liegt an der interpretation der objekt construction.<br />
Für den Compiler sind das alles Copy-Ctor's, erst Object initialisieren,<br />
dann zuweisen! Und bei der zuweisung interpretiert, wie oben gesagt,<br />
der Compiler den RVALUE als zieltypen.<br />
(Insofern eine passende zuweisungsregel vorliegt).</p>
<p>(willste den asm ausdruck sehen???? Das macht gcc und msvc so)</p>
<p>--------------------------</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich verstehe nicht Deine Obsession bzgl Implementierungsdetails des Compilers von Microsoft.</p>
</blockquote>
<p>Hehe, jeder hat doch seine macken, nicht? <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="🙂"
    /></p>
<p>Nein mal ehrlich: Wenn ich weiß, wie der Compiler, in meinem fall ist es halt<br />
MSVC (Mit gcc habe ich aber auch schon gearbeitet, für µC's jedenfalls),<br />
meine routinen, zuweisungen, callconventions, implementiert, weiß ich<br />
was ich wie verwenden darf, damit das gemacht wird was ich will.</p>
<p>Also den umgang mit ptr's, egal ob es ein offset für eine function /member ist,<br />
ob es ein offset für einen weiteren ptr ist usw, habe ich nicht in TP,VB,C/C++<br />
gelernt, sondern in asm.</p>
<p>Also bitte ich um verständniss und um rücksicht wenn ich mir (und vlt auch euch)<br />
klar machen will, was der compiler vor dem assembler eigentlich macht.<br />
------------------</p>
<p>Seid alle gegrüßt und nicht ärgern lassen <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2010123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2010123</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Sat, 22 Jan 2011 12:57:04 GMT</pubDate></item></channel></rss>