2017-02-20 7 views
1

sagen, dass ich ein Char-Array haben, das ist ok:C/C++ Initialisiere char-Array char const *

char myChars[100] = "hello"; 

Aber wenn ich eine

const char* hello="hello"; 
char myChars[100] = hello; 

oder

const char hello[6]="hello"; 
char myChars[100] = hello; 

es ist nicht erlaubt:

error: array must be initialized with a brace-enclosed intializer 

Scheint mir, dass dies im Grunde äquivalente Aussagen sind, warum ist das der Fall?

+0

Haben Sie versucht 'const char myChars [] =" Hallo ";'? –

+0

Ich benutze C++ auf arduino, ich dachte, die Sprachen wären in diesem Bereich ähnlich, wenn nicht bitte erklären, wie sie sich unterscheiden – jdex

+0

@Thomas Ich glaube nicht, dass das ist, was in Frage steht. –

Antwort

6

Da Zeiger keine Arrays sind und Arrays keine Zeiger sind.

Diese Beispiele sind nicht gleichwertig; Das String-Literal "hello" ist kein Zeiger, sondern ein const char[6], mit dem Sie Ihren char myChars[100] als Sonderfall initialisieren können.

Wenn Sie es jedoch zuerst zu einem Zeiger zerfallen lassen, können Sie diese Array-Ness später nicht mehr abrufen. Im allgemeinen Fall kann der Compiler nicht wissen, wie groß das Array sein würde oder ob es sogar eins ist. Daher ist das Initialisieren eines Arrays von einem Zeiger ungültig, egal was vorher kam.

+0

So ist es immer noch illegal zu tun: const char hallo [6] = "hallo"; 'und dann' char myChars [100] = hallo; ', ist das nicht eine äquivalente Aussage zu' char myChars [100] = "hallo ";" – jdex

+0

@jdex. Nein. Sie müssen wie ein Computer denken. 'char myChars [100] =" Hallo ";' sagt, mache ein Array von 100 Elementen und lasse syntaktischen Zucker, [eine spezielle Regel, um die Dinge einfacher zu machen] (https://en.wikipedia.org/wiki/Syntactic_sugar), initialisieren es mit einer Kopie, wenn ein String-Literal. 'char myChars [100] = Hallo;' sagt ein Array aus 100 Zeichen und versuche es mit einem Zeiger zu initialisieren. Es gibt keinen syntaktischen Zucker, um den letzten Logiksprung vom Zeiger zum 'Zeichen' zum Zeiger zum Zeichenfolgenliteral zu machen. – user4581301

+0

@jdex: Sie haben das Typproblem, aber jetzt haben Sie eine allgemeinere Regel getroffen, dass Arrays nicht kopiert werden können (außer im Sonderfall für Stringliterale). Jetzt sind wir in das Gebiet von vielleicht überraschenden Ausnahmen, die aus historischen Gründen da sind. Die zwei Anweisungen sind nicht äquivalent, weil "Hallo" 'ein Literal ist, aber" Hallo "ist eine Variable. Es tut uns leid! –

2

Sie müssen unterscheiden Zeiger und Arrays.

Nachstehend definiert einen Zeiger auf konstante Text:
const char* hello="hello";

Folgenden wird ein Array definiert:
char myChars[100];

Sie versuchen, einen Zeiger auf einen einzelnen Schlitz eines Arrays Zuweisen:
char myChars[100] = hello;

Am besten verwenden Sie std::string.

In Embedded-Programmierung, verwende ich oft:
static const char hello_text[] = "Hello";

Ich lasse den Compiler die Größe des Arrays bestimmen.

+1

* Sie versuchen, einem einzelnen Slot eines Arrays einen Zeiger zuzuweisen: *: nicht wirklich. Dies ist keine Zuweisung, aber eine Initialisierung und ein Zeiger ist kein richtiger Initialisierer für ein 'char'-Array. – chqrlie

1
char myChars[100] = hello; 

A char[] Array aus einem Zeigertyp (hello) nicht, da deren Typen verschieden sind, initialisiert werden.

Als Compiler-Fehlermeldung sagt, dass es mit einem char-Array initialisiert werden kann wörtliche wie:

char myChars[100] = "hello"; 

oder

char myChars[100] = { 'h', 'e', 'l', 'l', 'o', '\0' }; 

"hello" oder { 'h', 'e', 'l', 'l', 'o', '\0' } sowohl ableiten zu einem char[6] Array-Typ, das kann als Initialisierungscode für myChars verwendet werden.

Verwandte Themen