<?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[char* x[] oder char** x initialisieren.]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue eine Klasse, die folgende private member hat (haben soll)...</p>
<pre><code class="language-cpp">private:
	char* m_OsNames[11];
	char** m_OsNames2;
</code></pre>
<p>Hier habe ich einen Array von Zeigern auf char und kann damit dann<br />
mehrere &quot;Strings&quot; zuweisen. Ich weiß, das ich folgendes machen kann...</p>
<pre><code class="language-cpp">char* OSNames[] ={&quot;7 (NT Version 6.1)&quot;	,
		          &quot;Vista (NT Version 6.0)&quot;,
		          &quot;Server 2003 (NT Version 5.2)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;2000 (NT Version 5.0)&quot;,
		          &quot;ME&quot;,
		          &quot;NT4&quot;,
		          &quot;98&quot;,
		          &quot;95 OSR 2&quot;,
		          &quot;NT3&quot;,
		          &quot;95&quot;};
</code></pre>
<p>mit &quot;char** m_OsNames2;&quot; habe ich einen Zeiger auf einer Zeiger auf einen char's</p>
<p>und kann dann das machen...</p>
<pre><code class="language-cpp">m_OsNames2 = new char*[11];
m_OsNames2 = OSNames;
</code></pre>
<p>im Destruktor mache ich dann das ....</p>
<pre><code class="language-cpp">CSystem::~CSystem()
{
	delete m_OsNames2;
}
</code></pre>
<p>Wieso geht aber nicht...</p>
<pre><code class="language-cpp">m_OsNames[]={&quot;..&quot;,&quot;..&quot;,&quot;..&quot;}
</code></pre>
<p>also den m_OsNames erst so deklarieren und dann initialisieren.</p>
<p>Gruß<br />
Franky</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266480/char-x-oder-char-x-initialisieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 07:14:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266480.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 May 2010 20:18:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char* x[] oder char** x initialisieren. on Sun, 09 May 2010 20:18:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich baue eine Klasse, die folgende private member hat (haben soll)...</p>
<pre><code class="language-cpp">private:
	char* m_OsNames[11];
	char** m_OsNames2;
</code></pre>
<p>Hier habe ich einen Array von Zeigern auf char und kann damit dann<br />
mehrere &quot;Strings&quot; zuweisen. Ich weiß, das ich folgendes machen kann...</p>
<pre><code class="language-cpp">char* OSNames[] ={&quot;7 (NT Version 6.1)&quot;	,
		          &quot;Vista (NT Version 6.0)&quot;,
		          &quot;Server 2003 (NT Version 5.2)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;2000 (NT Version 5.0)&quot;,
		          &quot;ME&quot;,
		          &quot;NT4&quot;,
		          &quot;98&quot;,
		          &quot;95 OSR 2&quot;,
		          &quot;NT3&quot;,
		          &quot;95&quot;};
</code></pre>
<p>mit &quot;char** m_OsNames2;&quot; habe ich einen Zeiger auf einer Zeiger auf einen char's</p>
<p>und kann dann das machen...</p>
<pre><code class="language-cpp">m_OsNames2 = new char*[11];
m_OsNames2 = OSNames;
</code></pre>
<p>im Destruktor mache ich dann das ....</p>
<pre><code class="language-cpp">CSystem::~CSystem()
{
	delete m_OsNames2;
}
</code></pre>
<p>Wieso geht aber nicht...</p>
<pre><code class="language-cpp">m_OsNames[]={&quot;..&quot;,&quot;..&quot;,&quot;..&quot;}
</code></pre>
<p>also den m_OsNames erst so deklarieren und dann initialisieren.</p>
<p>Gruß<br />
Franky</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894858</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Sun, 09 May 2010 20:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to char* x[] oder char** x initialisieren. on Sun, 09 May 2010 20:20:43 GMT]]></title><description><![CDATA[<p>Eine Initialisierung kann nur mit einer Deklarierung daher gehen. Alles andere ist eine Zuweisung. Die = {...} Syntax funktioniert nur mit Initialisierungen.</p>
<p>Und wieso benutzt du nicht std::string?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894860</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Sun, 09 May 2010 20:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to char* x[] oder char** x initialisieren. on Sun, 09 May 2010 20:30:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">char* OSNames[] ={&quot;7 (NT Version 6.1)&quot;	,
		          &quot;Vista (NT Version 6.0)&quot;,
		          &quot;Server 2003 (NT Version 5.2)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;XP (NT Version 5.1)&quot;,
		          &quot;2000 (NT Version 5.0)&quot;,
		          &quot;ME&quot;,
		          &quot;NT4&quot;,
		          &quot;98&quot;,
		          &quot;95 OSR 2&quot;,
		          &quot;NT3&quot;,
		          &quot;95&quot;};
</code></pre>
<p>Stringliterale sind konstant, dementsprechend ist das nicht erlaubt. Du brauchst ein Array von const char*s.</p>
<pre><code class="language-cpp">m_OsNames2 = new char*[11];
m_OsNames2 = OSNames;
</code></pre>
<p>Du forderst Speicher an und überschreibst dann die Adresse mit OSNames? Macht keinen Sinn und erzeugt ein Speicherleck.</p>
<pre><code class="language-cpp">CSystem::~CSystem()
{
	delete m_OsNames2;
}
</code></pre>
<p>Ein new[] angeforderter Speicherbereich muss mit delete[] freigegeben werden.<br />
Ein überhaupt nicht mit new erzeugter Speicherbereich (OSNames) darf überhaupt nicht manuell freigegeben werden.</p>
<p>Du solltest std::string und std::vector benutzen, besonders solange du in Zeigern und ähnlichem noch nicht fit bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894868</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 09 May 2010 20:30:29 GMT</pubDate></item><item><title><![CDATA[Reply to char* x[] oder char** x initialisieren. on Mon, 10 May 2010 12:20:42 GMT]]></title><description><![CDATA[<p>Warum sollte er statische Strings auf den Heap packen? Besonders wenn die Klasse öfters initialisiert wird, soll er die schön in der .rdata lassen. <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/1895095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895095</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Mon, 10 May 2010 12:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to char* x[] oder char** x initialisieren. on Mon, 10 May 2010 14:09:45 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich heabe das jetzt so gemacht...</p>
<p>Header....</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

#ifdef SYSTEM_EXPORTS
#define SYSTEM_API __declspec(dllexport)
#else
#define SYSTEM_API __declspec(dllimport)
#endif

typedef int (__cdecl *DLLPROC)(LPWSTR);
const int MAX_OS_NAMES = 11;
const int MAX_FK_NAMES = 10;

// This class is exported from the System.dll
class SYSTEM_API CSystem {
	//constructor and desctructor section
public:
	CSystem(void);
	~CSystem();
	//member section started
private:
	const char* m_OsNames[MAX_OS_NAMES];
	const char* m_FkNames[MAX_FK_NAMES];
public:
	void OSVersion(char* lpOsVersion);
};

CSystem* System = NULL;
SYSTEM_API void  __stdcall CreateInstance(void);
SYSTEM_API void  __stdcall RealOSVersion(char* lpOsVersion);
</code></pre>
<p>und dann die cpp Datei...</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;System.h&quot;

CSystem::CSystem()
{
	m_OsNames[0] = &quot;7 (NT Version 6.1)&quot;;
	m_OsNames[1] = &quot;Vista (NT Version 6.0)&quot;;
    m_OsNames[2] = &quot;Server 2003 (NT Version 5.2)&quot;;
	m_OsNames[3] = &quot;XP (NT Version 5.1)&quot;;
	m_OsNames[4] = &quot;XP (NT Version 5.1)&quot;;
	m_OsNames[5] = &quot;2000 (NT Version 5.0)&quot;;
	m_OsNames[6] = &quot;ME&quot;;
	m_OsNames[7] = &quot;NT4&quot;;
	m_OsNames[8] = &quot;98&quot;;
	m_OsNames[9] = &quot;95 OSR 2&quot;;
	m_OsNames[10] = &quot;NT3&quot;;
	m_OsNames[11] = &quot;95&quot;;

	m_FkNames[0] = &quot;GetLocaleInfoEx&quot;;
    m_FkNames[1] = &quot;GetLargePageMinimum&quot;;
    m_FkNames[2] = &quot;GetDLLDirectory&quot;;
    m_FkNames[3] = &quot;GetNativeSystemInfo&quot;;
    m_FkNames[4] = &quot;ReplaceFile&quot;;
    m_FkNames[5] = &quot;OpenThread&quot;;
    m_FkNames[6] = &quot;GetThreadPriorityBoost&quot;;
    m_FkNames[7] = &quot;IsDebuggerPresent&quot;;
    m_FkNames[8] = &quot;GetDiskFreeSpaceEx&quot;;
    m_FkNames[9] = &quot;ConnectNamedPipe&quot;;
    m_FkNames[10] = &quot;Beep&quot;;
	return;
}

CSystem::~CSystem()
{
}

void  CSystem::OSVersion(char* lpOsVersion)
{
	HINSTANCE hLib = LoadLibrary(TEXT(&quot;KERNEL32.DLL&quot;)); 
    if ( hLib == NULL ){ 
        return; 
    } 
	for(int i=0;i&lt;MAX_FK_NAMES;i++)
	{
		DLLPROC Proc = (DLLPROC) GetProcAddress(hLib,m_FkNames[i]); 
		if(Proc !=NULL) break;
		switch(i)
		{
			case 0: 
				lpOsVersion = const_cast&lt;char*&gt;(m_OsNames[1]);
				break;
			case 1:
				lpOsVersion = const_cast&lt;char*&gt;(m_OsNames[2]);
				break;
			case 2:
				lpOsVersion = const_cast&lt;char*&gt;(m_OsNames[3]);
				break;
			default:
				lpOsVersion = &quot;Unkown OS&quot;;
		}
						;
	}
	FreeLibrary(hLib); 
}

SYSTEM_API void __stdcall CreateInstance(void)
{
	if(System == NULL)
	{
		System = new CSystem;	    
	}
}

SYSTEM_API void __stdcall RealOSVersion(char* lpOsVersion)
{
	if(System != NULL)
	{
		System-&gt;OSVersion(lpOsVersion);
	}
}
</code></pre>
<p>Da char* [] ein Array von Zeigern auf char sind, wird es im Header deklariert und dann initialisert. Da nicht mit new angelegt auch kein delete.</p>
<p>char* muß ich machen da die Klasse in einer VBA DLL und Strings in VBA wenn in einer DLL übergeben auf einen LPSTR (...char*) abegebildert werden.</p>
<p>Gruß<br />
Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895155</guid><dc:creator><![CDATA[FrankTheFox]]></dc:creator><pubDate>Mon, 10 May 2010 14:09:45 GMT</pubDate></item></channel></rss>