2010-11-16 7 views
0

J'ai un struct comme ceci:Que signifie 'char x []'?

struct A 
{ 
    char x[]; 
}; 

Qu'est-ce que cela signifie? Quand je fais quelque chose comme:

A a; 
a.x = "hello"; 

gcc renvoie une erreur en disant:

error: incompatible types in assignent of 'const char [6]' to 'char [0u]' 
+0

Cela semble être C++. L'exemple fourni ne sera pas compilé en tant que C car un simple «A» n'est pas défini à ce stade («struct A» est défini). La balise 'c' a été enlevée. – pmg

+0

@pmg L'exemple fourni ne sera pas compilé en tant que C++ non plus. 'test.cc:3:16: erreur: ISO C++ interdit le tableau de taille zéro 'x' – Cubbi

+0

@pmg: le code ne compile-t-il pas la raison de la question? –

Répondre

2

Tout d'abord, en C++, vous ne pouvez pas avoir un tableau de taille non spécifiée. En outre, vous devez utiliser un pointeur au lieu d'un tableau si vous souhaitez affecter les chaînes littérales:

struct A 
{ 
    char* x; 
}; 
+1

Pour le downvoter, la question est étiquetée "C++", j'ai juste oublié de dire que cela s'applique au C++. Je ne sais pas à propos de C99. – AraK

+0

Votre réponse est correcte pour C++ mais incorrecte pour C (C99). (Je ne suis pas le downvoter si.) –

-1

omble x [] peut être lu comme « x est un pointeur sur un tableau de char pour laquelle nous avons pas encore alloué la mémoire nécessaire ". Cependant vous devez spécifier une taille de contant (char x [6]) ou déclarer ceci comme un pointeur (char * x)

ax = "hello" ne fonctionne pas car ax ne pointe pas sur un espace de mémoire que vous pourriez ont alloué. De plus, le compilateur se plaint d'affecter quelque chose supposé être constant (la chaîne) à quelque chose qui pourrait être modifié par le programme.

Vous devez déclarer x constante ou copier la chaîne manuellement en utilisant une fonction telle que strcpy.

Par exemple:

struct A 
{ 
    char *x; 
}; 

A a; 
a.x = new char[6]; 
strcpy(a.x, "Hello"); 
+0

Oups, ne savait pas que char x [] étant autorisé dans C. –

+0

Cela ne compile pas: 'types incompatibles dans l'affectation de 'char *' à 'char [0u]'' . C'est parce que 'char x []' est un tableau; vous ne pouvez pas lui affecter un pointeur. –

2

Cette structure a un membre flexible C99 . En tant que tel, il est incorrect de déclarer des variables de type struct A, mais vous pouvez déclarer une variable de type struct A * (pointeur vers struct A) et utiliser malloc pour obtenir la mémoire pour comme:

struct A *a = malloc(sizeof *a + strlen(mystring) + 1); 
strcpy(a->x, mystring);