<?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[Verständnisfrage Pointer, Char, LPCSTR]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe noch ein paar Probleme mit dem Verständnis der Speicherreservierung.</p>
<pre><code class="language-cpp">char var[20]; //Speicher wir reserviert 
char* var2; //Keine Speicher reservierung, äußerte Vorsicht mit dem Umgang
char* var3=&quot;Hallo&quot;; //Speicher wird wieder reserviert.
</code></pre>
<p>LPCSTR wie sieht es da aus? Ist ja auch nur ein Pointer (LP) auf Char somit auch keine Speicherreservierung! Wie sind diese dann zu erstellen?</p>
<p>folgende Beispielfunktion</p>
<pre><code class="language-cpp">//Funktionsprototyp in einer .h
void GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer);
</code></pre>
<pre><code class="language-cpp">//In einer .cpp
void GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer)
 {
//... CODE der unwichtig ist ...
hRequest = WinHttpOpenRequest( hConnect,
				L&quot;GET&quot;,
				A2W(Request),//Konvertiert einen LPCSTR zum LPCWSTR
				L&quot;HTTP/1.1&quot;,
				WINHTTP_NO_REFERER,
			       WINHTTP_DEFAULT_ACCEPT_TYPES,
				0 );
//... CODE der unwichtig ist ...
	ResponceBuffer=new char[dwSize+1+*ResponceSize];
        //belegt Speicher mit 0
	ZeroMemory(ResponceBuffer,dwSize+1+*ResponceSize);
	strcat(ResponceBuffer,Temp); //Temp ist auch von der neuen Größe von ResponceBuffer
//... CODE der unwichtig ist ... 
}
</code></pre>
<p>so nun die Funktion aufrufen</p>
<pre><code class="language-cpp">//Aufruf der Funktion ist so 
int ResponceSize=0;
char* ResponceBuffer=&quot;&quot;;
GetResponce((LPCSTR)START ,myIP,&amp;ResponceSize ,ResponceBuffer);
</code></pre>
<p>ResponceBuffer wird angelegt und initialisiert. In der Funktion wird mit new Speicher reserviert und dem ResponceBuffer zugewiesen. Somit dürfte doch kein Speicher überschreiben möglich sein wenn die Variable nur lesend benutze?!</p>
<p>2.Frage ich übergebe ein #define -&gt; ((LPCSTR)START) an die Funktion. Nun müsste ja Speicher für START reserviert werden. Und nach dem verlassen der Funktion müsste dieser wieder freigeben werden!?</p>
<p>Vielen DAnk</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298521/verständnisfrage-pointer-char-lpcstr</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 19:51:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298521.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Jan 2012 09:24:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 09:24:07 GMT]]></title><description><![CDATA[<p>Hallo an alle,</p>
<p>ich habe noch ein paar Probleme mit dem Verständnis der Speicherreservierung.</p>
<pre><code class="language-cpp">char var[20]; //Speicher wir reserviert 
char* var2; //Keine Speicher reservierung, äußerte Vorsicht mit dem Umgang
char* var3=&quot;Hallo&quot;; //Speicher wird wieder reserviert.
</code></pre>
<p>LPCSTR wie sieht es da aus? Ist ja auch nur ein Pointer (LP) auf Char somit auch keine Speicherreservierung! Wie sind diese dann zu erstellen?</p>
<p>folgende Beispielfunktion</p>
<pre><code class="language-cpp">//Funktionsprototyp in einer .h
void GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer);
</code></pre>
<pre><code class="language-cpp">//In einer .cpp
void GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer)
 {
//... CODE der unwichtig ist ...
hRequest = WinHttpOpenRequest( hConnect,
				L&quot;GET&quot;,
				A2W(Request),//Konvertiert einen LPCSTR zum LPCWSTR
				L&quot;HTTP/1.1&quot;,
				WINHTTP_NO_REFERER,
			       WINHTTP_DEFAULT_ACCEPT_TYPES,
				0 );
//... CODE der unwichtig ist ...
	ResponceBuffer=new char[dwSize+1+*ResponceSize];
        //belegt Speicher mit 0
	ZeroMemory(ResponceBuffer,dwSize+1+*ResponceSize);
	strcat(ResponceBuffer,Temp); //Temp ist auch von der neuen Größe von ResponceBuffer
//... CODE der unwichtig ist ... 
}
</code></pre>
<p>so nun die Funktion aufrufen</p>
<pre><code class="language-cpp">//Aufruf der Funktion ist so 
int ResponceSize=0;
char* ResponceBuffer=&quot;&quot;;
GetResponce((LPCSTR)START ,myIP,&amp;ResponceSize ,ResponceBuffer);
</code></pre>
<p>ResponceBuffer wird angelegt und initialisiert. In der Funktion wird mit new Speicher reserviert und dem ResponceBuffer zugewiesen. Somit dürfte doch kein Speicher überschreiben möglich sein wenn die Variable nur lesend benutze?!</p>
<p>2.Frage ich übergebe ein #define -&gt; ((LPCSTR)START) an die Funktion. Nun müsste ja Speicher für START reserviert werden. Und nach dem verlassen der Funktion müsste dieser wieder freigeben werden!?</p>
<p>Vielen DAnk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171021</guid><dc:creator><![CDATA[John1920]]></dc:creator><pubDate>Sun, 22 Jan 2012 09:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 09:51:28 GMT]]></title><description><![CDATA[<p>1. Bis auf das new präsentierst du hier lupenreines C, kein C++.<br />
2. Du solltest Pointer verstehen, bevor du dich mit Speicherreservierungen rumschlägst.<br />
C/C++ kennen 3 Arten von Speicher: automatischen (Stack), dynamischen (Heap) und statischen Speicher.</p>
<pre><code class="language-cpp">{ // Anfang des Gültigkeitsbereichs (Scopes)
  char buf[200]; // Ein Array auf dem Stack, es wird automatisch genug Speicher reserviert.
} // Am Ende des Scopes wird der Speicher für &quot;buf&quot; automatisch freigegeben.

char* p; // Auch hier wird Speicher auf dem Stack angelegt. Allerdings nur für den Zeiger selbst. Der zeigt jetzt halt irgendwo hin.
p = malloc(200); // Jetzt zeigt p auf einen freien Speicherbereich.
free(p); // p zeigt immer noch auf den gleichen Speicherbereich, allerdings gehört dieser jetzt nicht mehr dem Programm.

char const* p = &quot;Hallo, Welt&quot;; // Das Stringliteral &quot;Hallo, Welt&quot; liegt im statischen Speicher, und p zeigt darauf.
                               // Man darf das Stringliteral allerdings nicht verändern, daher besser: &quot;char const*&quot;
                               // gesprochen &quot;pointer to const char&quot;.
</code></pre>
<p>Zu Funktionen:</p>
<pre><code class="language-cpp">void foo(char* buf, size_t size) // Hier wird ein Zeiger auf freien Speicher erwartet.
{
  for (size_t i = 0; i != size; ++i)
    buf[i] = 0; // Hier wird in den Speicher auf den buf zeigt geschrieben.
                // buf[i] entspricht *(buf + i)
}

int main(void)
{
  char buf[200];
  foo(buf, 200); // Korrekter Aufruf
  char* p = malloc(200);
  foo(p, 200); // Korrekter Aufruf
  free(p);
  char* s = &quot;Hallo, Welt&quot;; // Besser: char const*, dann meckert der Compiler.
  foo(s, 12); // Böse! s zeigt auf Speicher der nicht der nicht beschrieben werden darf.
  return 0;
}
</code></pre>
<p>LPSTR ist nur ein Windows typedef für char* und LPCSTR für char const*.</p>
<p>In C++ verlässt man sich bei der Speicherverwaltung übrigens ganz auf RAII:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

int main()
{
  std::vector&lt;char&gt; buf(5000); // 5000 byte auf dem Heap reserviert.
  buf[3245] = 'a';
} // Destruktor von std::vector gibt Speicher automatisch frei.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2171024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171024</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 22 Jan 2012 09:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 11:20:04 GMT]]></title><description><![CDATA[<p>John1920 schrieb:</p>
<blockquote>
<p>ich habe noch ein paar Probleme mit dem Verständnis der Speicherreservierung.</p>
<pre><code class="language-cpp">char var[20]; //Speicher wir reserviert 
char* var2;   //Keine Speicher reservierung, äußerte Vorsicht mit dem Umgang
char* var3=&quot;Hallo&quot;; //Speicher wird wieder reserviert.
</code></pre>
</blockquote>
<p>Die letzte Zeile verwendet eine für veraltet erklärte Konvertierung. Das sollte so aussehen:</p>
<pre><code class="language-cpp">const char* var3 = &quot;Hallo&quot;;
</code></pre>
<p>Denn Du darfst die Zeichen <em>so oder so</em> nicht ändern. Der Zeiger zeigt nämlich auf ein im statischen Speicher liegendes, unveränderliches Array. Nur mit dem const hintert Dich der Compiler auch daran, etwas verbotenes zu tun, was Dir andernfalls zur Laufzeit um die Ohren fliegen könnte.</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>LPCSTR wie sieht es da aus? Ist ja auch nur ein Pointer (LP) auf Char somit auch keine Speicherreservierung! Wie sind diese dann zu erstellen?</p>
</blockquote>
<p>LPCSTR hat wenig mit C++ zu tun. Das ist ein Windows-spezifischer typedef für die Windows-API. Ich glaube, das ist nur ein typedef für char*.</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>so nun die Funktion aufrufen</p>
<pre><code class="language-cpp">//Aufruf der Funktion ist so 
int ResponceSize=0;
char* ResponceBuffer=&quot;&quot;;
GetResponce((LPCSTR)START ,myIP,&amp;ResponceSize ,ResponceBuffer);
</code></pre>
</blockquote>
<p>Was ist START, wozu der C-style cast (&quot;(LPCSTR)&quot;)?!</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>ResponceBuffer wird angelegt und initialisiert. In der Funktion wird mit new Speicher reserviert und dem ResponceBuffer zugewiesen.</p>
</blockquote>
<p>Es gibt hier zwei ResponceBuffer-Variablen: Im Aufrufer-Code und in der Funktion. Den Zeiger in der Funktion veränderst Du. Die andere ResponceBuffer Variable verändert ihren Wert nicht. Die zeigt immer noch auf deinen &quot;Leer-String&quot;.</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>Somit dürfte doch kein Speicher überschreiben möglich sein wenn die Variable nur lesend benutze?!</p>
</blockquote>
<p>Ich verstehe die Frage nicht.</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>2.Frage ich übergebe ein #define -&gt; ((LPCSTR)START) an die Funktion.</p>
</blockquote>
<p>Bitte was?!</p>
<p>John1920 schrieb:</p>
<blockquote>
<p>Nun müsste ja Speicher für START reserviert werden. Und nach dem verlassen der Funktion müsste dieser wieder freigeben werden!?</p>
</blockquote>
<p>Ich habe mich schon vorhin gefragt, was START sein soll. Die Antwort auf diese Frage hängt davon ab.</p>
<p>Übrigens heißt das englische Wort &quot;response&quot; und nicht &quot;responce&quot;.</p>
<p>Tipp: Vergiss <code>new[]</code> ! Arbeite mit std::vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171048</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 22 Jan 2012 11:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 11:48:50 GMT]]></title><description><![CDATA[<p>Hallo cooky451,</p>
<p>danke für deine Hilfe.</p>
<p>Ja nicht einfach wenn man mal in c und dann wieder c++ schreibt (Studium) .. Zudem wenn man c++ nur Bruchstückhaft lernt. Und einfach die Zeit fehlt mal komplett von vorn alles zu machen.</p>
<p>Die Geschichte mit den Pointern meine ich verstanden zu haben.<br />
Was mir immer Kopfschmerzen macht ist es wenn ich einen char* var anlegen und einer Funktion übergebe. Und diese die Variable dynamisch beschreibt (mal 100 Zeichen, mal 200 Zeichen usw.). Dann kann ich es ja nur wie unten in der Funktion beschrieben machen?</p>
<p>LG John</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171061</guid><dc:creator><![CDATA[John1920]]></dc:creator><pubDate>Sun, 22 Jan 2012 11:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 12:02:18 GMT]]></title><description><![CDATA[<p>John1920 schrieb:</p>
<blockquote>
<p>Ja nicht einfach wenn man mal in c und dann wieder c++ schreibt (Studium) ..</p>
</blockquote>
<p>Dann schreib halt gleich in C und lass das new weg. (Durch malloc/calloc ersetzen.)<br />
Ist ja nicht schlimm, nicht alles muss C++ sein, nur wenn man C++ schreiben möchte, dann doch bitte auch einen std::vector nehmen. <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>Ich verstehe nicht ganz was du da oben erreichen willst, aber das sieht doch komisch aus.</p>
<pre><code class="language-cpp">void foo(char* p)
{
  p = malloc(50); // Hier änderst du die lokale Variable &quot;p&quot;.
  free(p);
}

int main(void)
{
  char* p = 0;
  foo(p); // Der Pointer selbst (also p, nicht *p) wird einfach kopiert!
  // p ist jetzt immer noch 0. Egal was du in der Funktion mit seiner Kopie gemacht hast.
  // p ist eine ganz normale Variable, wie int oder float oder char etc.
  return 0;
}
</code></pre>
<p>Wenn du einen Zeiger aus einer Funktion heraus verändern willst, brauchst du einen Zeiger auf ihn:</p>
<pre><code class="language-cpp">void foo(char** p)
{
  *p = malloc(50);
}

int main(void)
{
  char* p = 0;
  foo(&amp;p); // Jetzt übergibst du die Adresse von p
  // p hat jetzt einen anderen Wert. (Wenn malloc() nicht gefailt hat.. ;))
  free(p);
  return 0;
}
</code></pre>
<p>Aber im allgemeinen ist so etwas wenig ratsam. Wenn man kein RAII hat überlässt man die Speicherbeschaffung dem Aufrufer:</p>
<pre><code class="language-cpp">void foo(char* p, size_t size)
{
  strncpy(p, &quot;Hallo, Welt!&quot;, size);
}

int main(void)
{
  char* p = malloc(50);
  foo(p); // p kann nicht verändert werden, aber das braucht man ja auch gar nicht.
          // Man will nur das verändern worauf p zeigt.
  puts(p);
  free(p);
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2171064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171064</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 22 Jan 2012 12:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 12:04:43 GMT]]></title><description><![CDATA[<p>Sehe schon alles wieder in zu großer Hektik geschrieben.</p>
<pre><code>const char* var3 = &quot;Hallo&quot;;
</code></pre>
<p>Angenommen und verstanden</p>
<pre><code>Was ist START, wozu der C-style cast (&quot;(LPCSTR)&quot;)?!
</code></pre>
<p>Warum c-style? Cast ist noch ein Überbleibsel ... macht natürlich wenig Sinn!</p>
<pre><code>Es gibt hier zwei ResponceBuffer-Variablen: Im Aufrufer-Code und in der Funktion. Den Zeiger in der Funktion veränderst Du. Die andere ResponceBuffer Variable verändert ihren Wert nicht. Die zeigt immer noch auf deinen &quot;Leer-String&quot;.
</code></pre>
<p>Warum? Ich verbiege doch den Zeiger auf eine andere Adresse! Call by Ref. Oder Missverstehe ich dich jetzt?</p>
<p>Ja Responce natürlich :)!</p>
<p>Ja wie gesagt C und C++ Mischkultur. Wage mich noch nicht so ganz an vector und co.. Da muss ich nochmal mehr drüber lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171065</guid><dc:creator><![CDATA[John1920]]></dc:creator><pubDate>Sun, 22 Jan 2012 12:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 12:33:07 GMT]]></title><description><![CDATA[<p>John1920 schrieb:</p>
<blockquote>
<blockquote>
<p>Es gibt hier zwei ResponceBuffer-Variablen: Im Aufrufer-Code und in der Funktion. Den Zeiger in der Funktion veränderst Du. Die andere ResponceBuffer Variable verändert ihren Wert nicht. Die zeigt immer noch auf deinen &quot;Leer-String&quot;.</p>
</blockquote>
<p>Warum? Ich verbiege doch den Zeiger auf eine andere Adresse! Call by Ref. Oder Missverstehe ich dich jetzt?</p>
</blockquote>
<pre><code class="language-cpp">void foo(int x) { x=5; }  // &lt;-- dieses x ist ein eigenes der Funktion
void bar(int* p) { p=0; } // &lt;-- dieses p ist ein eigenes der Funktion
int main() {
  int x = 99;
  foo(x);
  // x ist hier immer noch 99!
  int* p = &amp;x;
  bar(p);
  // p zeigt hier immer noch auf x!
}
</code></pre>
<p>Wenn Du einen Zeiger &quot;by ref&quot; übergeben willst, sieht das so aus:</p>
<pre><code class="language-cpp">void bar1(int*&amp;p) { p=0; } // &lt;-- dieses p IST das des Aufrufers
void bar2(int**pp) { *pp=0; } // &lt;-- dieses pp zeigt auf das p des Aufrufers

int main() {
  …
  int* p = &amp;x;
  bar1(p); // oder bar2(&amp;p);
  // p ist jetzt 0!
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2171078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171078</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 22 Jan 2012 12:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 12:48:50 GMT]]></title><description><![CDATA[<p>Ha ... Hab einfach ein altes Repository ausgecheckt... Heute läufts...</p>
<p>Ich gebe natürlich die Adresse züruck und weise sie dem alten ResponceBuffer wieder zu. Sonst hätte es natürlich nie funktionieren können... Deshalb habe ich euch auch Missverstanden. Aber es wäre sicher hier besser den Zeiger per Ref zu übergeben und nicht die Adresse als return zu werfen...</p>
<p>char* GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171087</guid><dc:creator><![CDATA[John1920]]></dc:creator><pubDate>Sun, 22 Jan 2012 12:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 12:55:08 GMT]]></title><description><![CDATA[<p>John1920 schrieb:</p>
<blockquote>
<p>Ich gebe natürlich die Adresse züruck und weise sie dem alten ResponceBuffer wieder zu. Sonst hätte es natürlich nie funktionieren können...<br />
[…]<br />
char* GetResponce(LPCSTR Request,LPCSTR IP,int* ResponceSize,char* ResponceBuffer)</p>
</blockquote>
<p>Wozu ist dann jetzt der ResponceBuffer-Parameter?</p>
<p>response schreibt man immer noch mit einem s vor dem e.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171090</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 22 Jan 2012 12:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage Pointer, Char, LPCSTR on Sun, 22 Jan 2012 13:03:07 GMT]]></title><description><![CDATA[<p>Wie ich schon sagte wäre es natürlich sinnvoller den Buffer gleich per Ref zu übergeben ...</p>
<p>GetResponse(LPCSTR Request,LPCSTR IP,int* ResponseSize,char** ResponseBuffer)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171093</guid><dc:creator><![CDATA[John1920]]></dc:creator><pubDate>Sun, 22 Jan 2012 13:03:07 GMT</pubDate></item></channel></rss>