Zeichenfolgenliteral in c

7

Warum ist der folgende Code illegal?

%Vor%

Hat es etwas mit der Größe des Literals zu tun? Oder ist es einfach unzulässig, einem char-Array nach seiner Deklaration ein Zeichenfolgenliteral zuzuordnen?

    
ossau 13.08.2010, 03:52
quelle

6 Antworten

12

Es hat nichts mit der Größe zu tun. Sie können einem char-Array nach seiner Erstellung kein Zeichenfolgenliteral zuweisen - Sie können es nur zum Zeitpunkt der Definition verwenden.

Wenn Sie

tun %Vor%

es erstellt ein Array mit ausreichender Größe (einschließlich der abschließenden Null) und kopiert die Zeichenfolge in das Array. Es empfiehlt sich nicht, die Array-Größe anzugeben, wenn Sie sie mit einem Zeichenfolgenliteral initialisieren - Sie könnten das Nullzeichen nicht berücksichtigen.

Wenn Sie

tun %Vor%

Sie versuchen, der Adresse des Arrays zuzuweisen, was illegal ist.

EDIT: wie in anderen Antworten erwähnt, können Sie eine strcpy / strncpy tun, aber stellen Sie sicher, dass das Array mit der erforderlichen Länge initialisiert ist.

%Vor%     
Amarghosh 13.08.2010 03:54
quelle
6

Sie können Arrays niemals nach ihrer Erstellung zuweisen. das ist ebenso illegal:

%Vor%

Sie müssen Zeiger verwenden oder einem Index des Arrays zuweisen; Das ist legal:

%Vor%

Wenn Sie ein Array in der Struktur hinterlassen wollen, können Sie eine Funktion wie strcpy :

verwenden %Vor%

(Beachten Sie, dass das char-Array groß genug sein muss, um auch den Null-Terminator zu enthalten, also wollen Sie es wahrscheinlich char a[7] machen und das letzte Argument in strncpy auf 7 setzen)

    
Michael Mrozek 13.08.2010 03:57
quelle
6

Arrays sind non modifiable lvalues . Sie können ihnen also nicht zuweisen. Die linke Seite des Zuweisungsoperators muss ein modifiable lvalue sein.

Sie können jedoch ein Array initialisieren, wenn es definiert ist.

Zum Beispiel:

%Vor%

Sie können jedoch strncpy (a, "Hello World",20);

verwenden     
Prasoon Saurav 13.08.2010 03:58
quelle
3

Wie andere Antworten bereits gezeigt haben, können Sie ein Zeichen-Array nur mit einem String-Literal initialisieren, Sie können einem Zeichen-Array kein String-Literal zuweisen. Strukturen (auch solche, die Zeichen-Arrays enthalten) sind jedoch ein weiterer Kessel Fisch.

Ich würde nicht empfehlen, dies in einem tatsächlichen Programm zu tun, aber dies zeigt, dass Arrays zwar Arrays zugewiesen werden können, aber Strukturen, die Array-Typen enthalten.

%Vor%

In Ihrem ursprünglichen Beispiel sollte der folgende Code also in Ordnung sein:

%Vor%     
dreamlax 13.08.2010 04:45
quelle
1

Beachten Sie, dass, um die Zeichenfolge "onetwo" in Ihrem Array zu speichern, sie die Länge [7] haben muss und nicht wie in der Frage geschrieben sein muss. Das zusätzliche Zeichen dient zum Speichern des Abschlusszeichens '\ 0'.

    
ysap 13.08.2010 04:15
quelle
1

Es wird kein strcpy oder C99 compund literal benötigt. Das Beispiel in reinem ANSI C:

%Vor%     
user411313 10.01.2012 21:45
quelle

Tags und Links