2016-05-14 2 views
15

Ich bin ein Anfänger C-Programmierer, gestern lernte ich die Verwendung von C-Strukturen und die mögliche Anwendung dieser über die Auflösung von spezifische Probleme. Als ich jedoch mit meiner C IDE (Codeblocks 16.01) experimentierte, um diesen Aspekt der C-Programmierung zu lernen, bin ich auf ein seltsames Problem gestoßen. Der Code ist der folgende:"Fehler: Zuordnung zu Ausdruck mit Array-Typ Fehler", wenn ich ein Struct-Feld (C) zuweisen

#include <stdio.h> 

#define N 30 

typedef struct{ 
    char name[N]; 
    char surname[N]; 
    int age; 
} data; 

int main() { 
    data s1; 
    s1.name="Paolo"; 
    s1.surname = "Rossi"; 
    s1.age = 19; 
    getchar(); 
    return 0; 
} 

Während der Kompilierung der Compiler (GCC 4.9.3-1 unter Windows) berichtet mir einen Fehler, der

"error: assignment to expression with array type error"

auf Anweisung sagt

s1.name="Paolo" 
s1.surname="Rossi" 

während ich es tue

data s1 = {"Paolo", "Rossi", 19}; 

es funktioniert. Was mache ich falsch?

+6

Sie haben einen der Unterschiede zwischen Zuweisung und Initialisierung entdeckt. –

+1

Können Sie genauer sein? Danke;) – Chief096

+0

Sie können 's1 = (const Daten) {" Paolo "," Rossi ", 19} schreiben;' –

Antwort

23

Sie stehen vor Problem in

s1.name="Paolo"; 

, weil in der LHS, verwenden Sie einen Array Typen, der nicht zuweisbare ist.

zu erarbeiten, aus C11, Kapitel §6.5.16

assignment operator shall have a modifiable lvalue as its left operand.

und in Bezug auf die modifizierbar lvalue, von Kapitel §6.3.2.1

A modifiable lvalue is an lvalue that does not have array type, [...]

Sie müssen strcpy() verwenden, um in das Array kopieren.

Das gesagt, data s1 = {"Paolo", "Rossi", 19}; funktioniert gut, denn dies ist keine direkte Zuweisung mit Zuordnung Operator. Dort verwenden wir eine geschichtete Initialisierungsliste, um die Anfangswerte des Objekts bereitzustellen. Das folgt dem Gesetz der Initialisierung, wie in Kapitel erwähnt §6.7.9

Each brace-enclosed initializer list has an associated current object. When no designations are present, subobjects of the current object are initialized in order according to the type of the current object: array elements in increasing subscript order, structure members in declaration order, and the first named member of a union.[....]

+1

Wenn ich 'char * b =" Hallo "' habe, und wenn ich 'char c [] habe = "Hallo" ', beide funktionieren, wenn für den ersten Fall ich' b = "helloworld" ', es funktioniert auch, aber für den zweiten Fall, wenn ich' c = "helloworld" 'mache, warum nicht? –

+0

@SurajJain das ist genau das, was in der Antwort erklärt wird. Sie können einem Array nicht zuweisen. –

+1

Das war schnell. –

5

Bitte aktivieren Sie dieses Beispiel hier: Accessing Structure Members

Es wird erklärt, dass der richtige Weg, es zu tun ist, wie folgt aus:

strcpy(s1.name , "Egzona"); 
printf("Name : %s\n", s1.name); 
+0

Dies hat einen zusätzlichen Funktionsaufruf-Overhead (den Compiler inline auswählen können, aber in der Regel nicht), der eine Schleife statt Inline ausführt, und diese Schleife wird nicht eliminiert, wenn der Computer, auf dem Sie kompilieren, das Ganze in einem kopieren kann bewegen, es macht immer mindestens eine Iteration. Dies scheint so zu sein, als könnte es nicht ohne Vorverarbeitung des Quellcodes gelöst werden, da C das nicht für Sie tut. 'char x [2] = {'h', 0}; * (char (*) [2]) & x = * (char (*) [2]) & x; 'sollte wesentlich schneller als' strcpy (x, x, 2) 'sein, wenn es gültig war C. – Dmitry

Verwandte Themen