Attribuer à un tableau de struct en c
J'ai le code suivant:
typedef struct Test {
long mem[1000];
} Test;
extern Test *test;
int main() {
Test *test = (Test *)malloc(sizeof(Test));
test->mem[0] = 1;
test->mem[1] = 2;
test->mem[2] = 3;
test->mem[3] = 4;
test->mem[4] = 5;
test->mem[5] = 6;
return 0;
}
Ça fonctionne OK, mais je veux changer le initalization de la mem tableau de cette façon:
test->mem = {1,2,3,4,5,6};
Mais la gcc me donne cette erreur:
erreur: attendu expression before '{' token test->mem = {1,2,3,4,5,6};
Avec une flèche pointant vers la gauche ouvrir des accolades.
Ce que cela peut être?
Merci!
EDIT:
J'ai aussi essayer ce code:
long mem[1000] = {1,2,3,4,5,6};
test->mem = mem;
Et j'obtiens cette erreur de gcc:
error: incompatible types lors de l'affectation de type 'long int[1048576]'
de type " long int *' test->mem = mem;
Je ne suis pas permettre d'utiliser toutes les fonctions C.
OriginalL'auteur Nir | 2014-01-22
Vous devez vous connecter pour publier un commentaire.
La syntaxe
something = { initial values }
est autorisé que dans des initialisations, où un objet est défini comme:Une expression comme
x = value
est un affectation et ne peut pas utiliser la syntaxe pour les initialisations.Une alternative consiste à créer un objet temporaire, qui vous initialiser, puis copiez le contenu de l'objet temporaire dans la cible:
Concernant le montage:
Les tableaux ne peuvent pas être cédés;
x = value
n'est pas valide six
est un tableau. Toutefois, les structures peuvent être affectés, et donc une autre alternative est de créer une structure comme un objet temporaire, l'initialiser, et de l'affecter:Noter, cependant, que ce code n'est quelque chose que le code précédent ne fonctionne pas. Au préalable l'exemple que j'ai montré simplement des copies de six éléments dans le tableau. Ce code crée un objet temporaire de type
Test
, qui contient plus de 1000 éléments, la plupart d'entre eux de zéro, et la copie de l'ensemble de ces éléments dans*test
. Même si le compilateur optimise ce et utilise un code pour effacer*test
plutôt que de copier les zéros stockées dans la mémoire, il prend plus de temps qu'une simple copie de six éléments. Donc, si vous voulez juste quelques éléments initialisés et ne se soucient pas du reste, utiliser l'ancien code. Si vous souhaitez que tous les éléments initialisés (la plupart à zéro), vous pouvez utiliser le dernier code. (Même si, je voudrais envisager d'autres solutions, comme l'utilisation decalloc
au lieu demalloc
.)OriginalL'auteur Eric Postpischil
Tableaux ne sont pas des pointeurs (mais les tableaux de décroissance pour les pointeurs, voir cette), et vous ne pouvez pas attribuer les tableaux (seulement initialiser, ou de céder
struct
-s qui en contiennent). Vous pouvez copier le tableau, par exempleBTW, vous pouvez copier sans l'aide de
memcpy
par le codage de votre bouclefor (int i=0; i<6; i++) test->mem[i] = arr[i];
....Cela laisse 9994 entiers dans
test
non initialisées; vous pouvez effacer les:ou utiliser un autre
for
boucle.Vous pouvez également définir votre initialisé structure, par exemple
attribuer, par exemple,
mais vous ne pouvez pas attribuer les tableaux! Même
ne compile pas.
FWIW, C++11 a std::array pour aider à ce sujet.
La §6.5.16.1 Simple affectation section de la C11 standard (voir n1570 projet page 102) énumère un ensemble de contraintes en termes d'affectation, et le tableau d'affectation ne pas s'y insérer. Par conséquent, il est interdit. Une règle de base est que seuls les scalaires (qui inclut des pointeurs et numérique l-valeurs) ou
struct
-s peuvent apparaître sur le côté gauche d'une affectation (ou êtrereturn
-ed à partir d'une fonction).Je ne vois pas comment l'énoncé “les Tableaux ne sont pas des pointeurs” est pertinente. Le code en question ne tentez pas d'utiliser un pointeur d'un tableau ou vice-versa. Le problème est de tenter d'établir une affectation à l'aide de l'initialisation de la syntaxe.
Je crois qu'il est devenu pertinent avec la dernière édition de la question.
L'édition tente d'affecter un tableau à un autre, de ne pas utiliser un tableau comme un pointeur ou vice-versa. Le message d'erreur mentionne le pointeur qui a été produite à partir de la matrice, mais qui n'est pas le cas des OP intention.
OriginalL'auteur Basile Starynkevitch