Dupliqué possible: strong>
Comment initialiser un tableau en C
Initialisation d'un tableau d'INTS P>Je me demande sur le moyen le plus rapide / le plus simple d'initialiser un réseau INT pour seulement contenir -1 valeurs. Le tableau que j'ai besoin est de 90 intens longs de sorte que la voie directe devrait être de l'initialiser comme celle-ci: p>
xxx pré> mais je veux seulement utiliser la matrice une fois, donc je veux donc pouvoir pouvoir être capable. Pour l'utiliser de manière dynamique et être capable de le libérer après l'avoir utilisé dans le programme, je suis donc plus à la recherche d'un moyen rapide comme
calloc code>, mais au lieu de zéros, -1 bien sûr. P> < / blockquote>
6 Réponses :
Il n'est pas possible de le faire dans la norme C à l'initialisation sans énumérer explicitement tous les initialiseurs.
dans gnu c Vous pouvez utiliser gnu c initialiseurs désignés p> après l'initialisation: p>
L'approche MEMSET code> semble un peu piraquable pour moi. Il est vrai que -1 code> est représenté comme une séquence d'octets qui ont toutes la valeur -1 code>, mais la raison pour laquelle il fonctionne n'est pas évident en un coup d'œil IMHO.
@ruakh je suis d'accord c'est. Et ce n'est pas portable à l'extérieur du complément de deux deux. Je pensais un peu c'était un tableau code> tableau code> mais pour un tableau int code> Je pense qu'un pour code> boucle est meilleur. J'ai mis à jour ma réponse pour utiliser une boucle au lieu du memset code> code> appel.
@ouah puis-je libérer ce tableau après?
Si vous utilisez GCC, utilisez Initializer désigné Pour ce faire de manière dynamique, vous devrez allouer avec Utilisez ceci: p> MALLOC code> puis vous libérerez uniquement la mémoire, sinon libérant la mémoire qui n'est pas attribuée par malloc code>, calloc code> ou realloc code> est un comportement non défini. p> int *array;
array=malloc(sizeof(int)*n);
for(i=0;i<n;array[i++]=-1);
// After use free this
free(array);
Bon conseil, mais je pense que vous avez manqué quelque chose? I.E Je veux pouvoir l'utiliser de manière dynamique et être capable de le libérer après B>
Vous pouvez le faire de manière dynamique aussi
Oui en effet, mais vous ne pouvez pas libérer int gray [90] = .... code>. De plus, le memset est optimisé pour copier de nombreux octets par opération de la CPU. La boucle a besoin de 90 itérations, alors à moins que le compilateur ne se déroule de la boucle pour vous, puis optimise cela plus loin que vous prendrez plus de temps si vous «rouler-votre-propre». Je trouverai une référence si vous aimez.
@enhzflep: Voir mon édition pour une matrice dynamique
Memset ne fonctionne que pour définir 0, -1 et tous les autres numéros où les 4bytes de l'entier sont identiques, mais ne fonctionnent pas comme une solution générale.
@LTWORF: Je n'ai pas mentionné memset code> alors quel est votre point?
Eh bien, Bugger Me Sideways - J'avais confondu Memse avec Memmove ou autre chose, peut-être Strcpy, j'oublie. Quoi qu'il en soit, en utilisant le compteur de haute performance indique que le temps nécessaire à 100 millions d'éléments est égal à un appel MEMSET et une boucle. Vous postez obtient mon vote. :)
@Omkant merci, c'était ce que je cherchais ..
memset( array, -1 , sizeof(array) ) ; It can be used for initialising with 0 or -1
Comment l'utiliseriez-vous pour initialiser un tableau avec 1 code>?
MEMSET (tableau, 1, taille de taille (tableau)); pour initialiser un tableau avec tous les 1.
Nope, ça ne fonctionnera pas. Essayez-le; Si vous avez des entiers 32 bits, il les initialisera tous à 16843009 code>!
oui correct, éditer mon post!
90 mots n'est pas beaucoup de mémoire. Vous êtes susceptible d'utiliser une bonne fraction de votre temps allouant / désaffectant la mémoire. Le mettre sur la pile est probablement plus rapide que de créer de manière dynamique la mémoire. Je verrais que si une réponse d'une boucle ou d'Omkant fonctionnerait. S'il s'avère vraiment le goulot d'étranglement, vous pouvez commencer à optimiser.
for (i = 0; i < 90; ++i) { array[i] = -1; }
Il n'y a pas de moyen simple, Caltoc s'initialise uniquement à 0.
Vous pouvez faire P>
memset(array,-1,sizeof(int)*size);
Ça fait mal d'écrire ceci, mais vous pouvez toujours utiliser une macro puis dans un autre code: p>
Un autre: Stackoverflow.com/ Questions / 201101 / ...