<?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[zeiger auf std::vector speicher]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>ich habe folgenden Code:</p>
<pre><code class="language-cpp">struct sPaket
{
  int id;
  int length;
  int objID;
  std::vector&lt;int&gt; vec;
};

sPaket msg;

recv(wParam, (char *)&amp;msg, sizeof(msg), 0);

size_t len = msg.vec.size();     //Hier funktioniert es noch
int fehler = msg.vec[0];     //Hier bricht das Programm ab
</code></pre>
<p>So, recv() (aus Winsock) liest hier Daten ein. Byte für Byte quasi. Das klappt alles wunderbar, nur als ich jetzt versucht habe, in meinem Struct auch einen std::vector unterzubringen, verließ mich mein Glück. Also ich habe mit Vectoren schon ein bißchen was gemacht, habe aber noch keine wirklich große Erfahrung damit.<br />
Kann mir jemand erklären, warum Zeile 13 funktioniert, das Programm in Zeile 14 aber abstürzt?</p>
<p>Danke schon mal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/229196/zeiger-auf-std-vector-speicher</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 14:44:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/229196.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Dec 2008 18:49:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 18:51:07 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>ich habe folgenden Code:</p>
<pre><code class="language-cpp">struct sPaket
{
  int id;
  int length;
  int objID;
  std::vector&lt;int&gt; vec;
};

sPaket msg;

recv(wParam, (char *)&amp;msg, sizeof(msg), 0);

size_t len = msg.vec.size();     //Hier funktioniert es noch
int fehler = msg.vec[0];     //Hier bricht das Programm ab
</code></pre>
<p>So, recv() (aus Winsock) liest hier Daten ein. Byte für Byte quasi. Das klappt alles wunderbar, nur als ich jetzt versucht habe, in meinem Struct auch einen std::vector unterzubringen, verließ mich mein Glück. Also ich habe mit Vectoren schon ein bißchen was gemacht, habe aber noch keine wirklich große Erfahrung damit.<br />
Kann mir jemand erklären, warum Zeile 13 funktioniert, das Programm in Zeile 14 aber abstürzt?</p>
<p>Danke schon mal im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627191</guid><dc:creator><![CDATA[iop]]></dc:creator><pubDate>Mon, 08 Dec 2008 18:51:07 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 18:59:52 GMT]]></title><description><![CDATA[<p>iop schrieb:</p>
<blockquote>
<p>Also ich habe mit Vectoren schon ein bißchen was gemacht, habe aber noch keine wirklich große Erfahrung damit.<br />
Kann mir jemand erklären, warum Zeile 13 funktioniert, das Programm in Zeile 14 aber abstürzt?</p>
</blockquote>
<p>Kannst du dir denken was passiert, wenn man einen Zeiger Byteweise über Programmgrenzen hinweg setzt? Vector arbeitet mit einem dynamisch allozierten Speicherbereich (Als Anwender sieht man davon nichts).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627194</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 08 Dec 2008 18:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 20:50:46 GMT]]></title><description><![CDATA[<p>Achso, ja natürlich, std::vector alloziert seinen Speicher dynamisch, was bedeutet, dass der sonstwo liegt (irgendwo auf dem Heap, was ja schonmal nicht auf dem Stack ist, wo die anderen &quot;Struct-Teilnehmer&quot; liegen) - richtig?</p>
<p>Ok, gäbe es denn eine Möglichkeit, an den Speicher ranzukommen?</p>
<p>EDIT:</p>
<p>Es ist ja nicht so, dass ich nicht schon selbst versucht hätte das zu lösen, aber ich kriegs nicht hin. Ich habe für mein recv() nämlich leider keine Information, wieviel da anokommt, deshalb brauche ich (meiner Meinung nach) einen dynamischen Buffer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627255</guid><dc:creator><![CDATA[iop]]></dc:creator><pubDate>Mon, 08 Dec 2008 20:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 20:54:32 GMT]]></title><description><![CDATA[<p>iop schrieb:</p>
<blockquote>
<p>Ok, gäbe es denn eine Möglichkeit, an den Speicher ranzukommen?</p>
</blockquote>
<p>Welchen Speicher willst du genau?</p>
<p>Das interne Array kriegst du mit <code>&amp;vec[0]</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627271</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Dec 2008 20:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 21:01:52 GMT]]></title><description><![CDATA[<p>Der ganze Code ist sinnfrei, weil dein vector nie initialisiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627281</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Mon, 08 Dec 2008 21:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 21:40:52 GMT]]></title><description><![CDATA[<p>iop schrieb:</p>
<blockquote>
<p>Es ist ja nicht so, dass ich nicht schon selbst versucht hätte das zu lösen, aber ich kriegs nicht hin...</p>
</blockquote>
<p>Ich habe selbst noch nichts mit Winsock gemacht, aber du kannst nur dann einen Vector verwenden, wenn du ihm von vorne herein die Größe angeben kannst, und selbst dann könnte das Ergebnis undefiniert sein (Ich weiß nicht ob man wirklich manipulierend auf den Bereich, den man über mittels &amp;vec[0] auslesen kann [Zeiger auf den anfangsbereich] zugreifen darf...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627313</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 08 Dec 2008 21:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Mon, 08 Dec 2008 22:44:34 GMT]]></title><description><![CDATA[<p>Du musst halt deine Puffer-Größe selbst festlegen - dieses Anwendungsgebiet lässt sich mit Vectoren ziemlich schlecht vereinbaren, aber wenn doch, dann solltest du ihm davor mit reserve die Länge angeben und dann wie bereits gesagt mit &amp;vec[0] die adresse übergeben...</p>
<pre><code class="language-cpp">char msg[128];
recv(wParam, &amp;msg[0], 128, 0);
</code></pre>
<p>Oder falls du deine Klasse behalten willst, dann so:</p>
<pre><code class="language-cpp">struct TPacket
{
 char buf[128];
 int id;
 int length;
 int objID;
};

TPacket packet;
recv(wParam, &amp;packet.msg[0], 128, 0);
</code></pre>
<p>Ich kann dir aber nicht sagen, welche Größe man für den Puffer wählen sollte...<br />
Imho könntest du aber auch einen vector nehmen und im CTor nen reserve(laenge) machen und ich glaube, recv gibt die anzahl an bytes zurück, die empfangen wurden.</p>
<p>Also:</p>
<pre><code class="language-cpp">struct TPacket
{
 std::vector &lt;char&gt; buf;
 int id;
 int objID;
 TPacket() {buf.reserve(128);}
};

TPacket packet;
recv(wParam, &amp;packet.msg[0], 128, 0);
</code></pre>
<p>Allerdings hat die Variante nun nicht mehr sooo viele Vorteile gegenüber eines char buf[x];</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627355</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 08 Dec 2008 22:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 06:25:56 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>(Ich weiß nicht ob man wirklich manipulierend auf den Bereich, den man über mittels &amp;vec[0] auslesen kann [Zeiger auf den anfangsbereich] zugreifen darf...).</p>
</blockquote>
<p>Ja, darf man.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627419</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 09 Dec 2008 06:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 07:13:21 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>(Ich weiß nicht ob man wirklich manipulierend auf den Bereich, den man über mittels &amp;vec[0] auslesen kann [Zeiger auf den anfangsbereich] zugreifen darf...).</p>
</blockquote>
<p>Ja, darf man.</p>
</blockquote>
<p>Was ich nicht glaube (spätestens wenn man die Anzahl an Elementen ändert - auch, wenn man davor den Speicherplatz mit reserve angefordert hat)...<br />
Die Einträge an sich darf man aber logischerweise ändern.<br />
Also müsste man den Vector vor dem ersten Benutzen schon füllen - nur, um die Positionen dann zu überschreiben... Spricht auch nicht gerade für std::vector ^^<br />
Das heißt, dass man doch wieder die Länge braucht, die ich beim letzten Code-Schnipsel weggelassen hatte ^^ Aber wie gesagt würde ich auf vector verzichten - da mir auch kein Grund einfallen würde, ihn hier zu benutzen ^^</p>
<p>PS: Das soll nat. nicht heißen, dass vector scheiße ist und man generell auf ihn verzichten sollte - aber hier in diesem Fall macht das denke ich durchaus Sinn - nicht nur performance-technisch ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627435</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 09 Dec 2008 07:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 07:52:09 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>(spätestens wenn man die Anzahl an Elementen ändert - auch, wenn man davor den Speicherplatz mit reserve angefordert hat)...</p>
</blockquote>
<p>Spätestens, wenn man die Anzahl der Elemente ändert, ist was?</p>
<blockquote>
<p>Die Einträge an sich darf man aber logischerweise ändern.</p>
</blockquote>
<p>Daraus und aus ( &amp;vector[n] == &amp;vector[0] + n ) folgt, dass ich auch die ganze Sequenz ändern darf.</p>
<blockquote>
<p>Also müsste man den Vector vor dem ersten Benutzen schon füllen - nur, um die Positionen dann zu überschreiben...</p>
</blockquote>
<p>Stimmt, mit resize(). Das dürfte aber auch nicht sonderlich viel kosten.</p>
<blockquote>
<p>Das heißt, dass man doch wieder die Länge braucht, die ich beim letzten Code-Schnipsel weggelassen hatte</p>
</blockquote>
<p>Du brauchst <strong>immer</strong> die Länge von Daten variabler Länge. Was hat das hier für eine Bewandnis?</p>
<blockquote>
<p>Aber wie gesagt würde ich auf vector verzichten - da mir auch kein Grund einfallen würde, ihn hier zu benutzen</p>
</blockquote>
<p>Mir schon: Das automatische Aufräumen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627443</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 09 Dec 2008 07:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 08:24:00 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>(spätestens wenn man die Anzahl an Elementen ändert - auch, wenn man davor den Speicherplatz mit reserve angefordert hat)...</p>
</blockquote>
<p>Spätestens, wenn man die Anzahl der Elemente ändert, ist was?</p>
</blockquote>
<p>Imho ist so etwas nicht definiert:</p>
<pre><code class="language-cpp">void test (int *first)
{
 for (int i(0); i != 500; ++i)
 {
  *first++ = i;
 }
}

std::vector &lt;int&gt; bla;
bla.reserve(500);
test(&amp;bla[0]);
</code></pre>
<p>LordJaxom schrieb:</p>
<blockquote>
<blockquote>
<p>Die Einträge an sich darf man aber logischerweise ändern.</p>
</blockquote>
<p>Daraus und aus ( &amp;vector[n] == &amp;vector[0] + n ) folgt, dass ich auch die ganze Sequenz ändern darf.</p>
</blockquote>
<p>Aber nur so lange, wie ich die Anzahl der Elemente nicht verändere?!</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<blockquote>
<p>Das heißt, dass man doch wieder die Länge braucht, die ich beim letzten Code-Schnipsel weggelassen hatte</p>
</blockquote>
<p>Du brauchst <strong>immer</strong> die Länge von Daten variabler Länge. Was hat das hier für eine Bewandnis?</p>
</blockquote>
<p>Das ich beim letzten Post bei der Variante mit dem vector die Länge nicht mitgespeichert hab, weil ich davon ausgegangen war, dass wir sie eh haben (vector::size()) - und ich es nur noch mal der Vollständigkeit halber erwähnen wollte...</p>
<p>LordJaxom schrieb:</p>
<blockquote>
<blockquote>
<p>Aber wie gesagt würde ich auf vector verzichten - da mir auch kein Grund einfallen würde, ihn hier zu benutzen</p>
</blockquote>
<p>Mir schon: Das automatische Aufräumen.</p>
</blockquote>
<p>Schade nur, dass das kein Vorteil gegenüber <code>char []</code> ist sondern nur gegenüber <code>char *</code> ansonsten muss ich dir natürlich Recht geben <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>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627460</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 09 Dec 2008 08:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 08:48:37 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Imho ist so etwas nicht definiert:</p>
<pre><code class="language-cpp">void test (int *first)
{
 for (int i(0); i != 500; ++i)
 {
  *first++ = i;
 }
}

std::vector &lt;int&gt; bla;
bla.reserve(500);
test(&amp;bla[0]);
</code></pre>
</blockquote>
<p>Wenn Du statt reserve() resize() nimmst, schon.</p>
<blockquote>
<blockquote>
<p>Daraus und aus ( &amp;vector[n] == &amp;vector[0] + n ) folgt, dass ich auch die ganze Sequenz ändern darf.</p>
</blockquote>
<p>Aber nur so lange, wie ich die Anzahl der Elemente nicht verändere?!</p>
</blockquote>
<p>Ja? Wenn Du einen Array reallozierst, kannst Du auch nicht die alten Adressen weiterwenden.</p>
<blockquote>
<p>Das ich beim letzten Post bei der Variante mit dem vector die Länge nicht mitgespeichert hab, weil ich davon ausgegangen war, dass wir sie eh haben (vector::size()) - und ich es nur noch mal der Vollständigkeit halber erwähnen wollte...</p>
</blockquote>
<p>Nun, man müsste zunächst den Vector auf die Größe bringen, die wir maximal empfangen wollen, und danach auf die Größe, die recv tatsächlich zurückgegeben hat. Dann brauchen wir nur noch size().</p>
<blockquote>
<p>Schade nur, dass das kein Vorteil gegenüber <code>char []</code> ist sondern nur gegenüber <code>char *</code> ansonsten muss ich dir natürlich Recht geben <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>Da hast Du natürlich recht, da hab ich nicht aufgepasst. Aber spätestens, wenn einem auffällt, dass die x Bytes nicht gereicht haben, und man noch einen recv machen muss, um die komplette Nachricht zu empfangen, hat man aber genau dieses Problem :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627475</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 09 Dec 2008 08:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Tue, 09 Dec 2008 09:53:10 GMT]]></title><description><![CDATA[<p>ich hatte das bis jz glaube ich immer über nen char[] gelöst (das einzelne Empfangen) und dann nen vector&lt;char&gt; genommen und den puffer reingespeichert...</p>
<p>das hat zwar den nachteil, dass man jedes mal noch mal alles umkopieren muss, aber da kommt man ja ohnehin nie (?) drum rum...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1627506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1627506</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 09 Dec 2008 09:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to zeiger auf std::vector speicher on Thu, 18 Dec 2008 14:44:36 GMT]]></title><description><![CDATA[<p>He,<br />
ich wollte mich eigentlich nur nochmal bedanken, ihr habt mir wirklich geholfen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1632418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1632418</guid><dc:creator><![CDATA[iop]]></dc:creator><pubDate>Thu, 18 Dec 2008 14:44:36 GMT</pubDate></item></channel></rss>