Comment initialiser un tableau dynamique alloué avec malloc? Puis-je faire ceci:
int *p;
p = malloc(3 * sizeof(*p));
p = {0, 1, 2};
...
free(p);
Ou dois-je faire quelque chose comme ça:
int *p, x;
p = malloc(3 * sizeof(*p));
for (x = 0; x < 3; x++)
p[x] = 0;
...
free(p);
Ou existe-t-il une meilleure façon de le faire?
Vous devez allouer un bloc de mémoire et l'utiliser comme un tableau comme:
int *arr = malloc (sizeof (int) * n); /* n is the length of the array */
int i;
for (i=0; i<n; i++)
{
arr[i] = 0;
}
Si vous devez initialiser le tableau avec des zéros, vous pouvez également utiliser la fonction memset
de stdlib.
memset (arr, 0, sizeof (int) * n);
Ici 0
Est la constante avec laquelle chaque locatoin du tableau sera définie. Notez que le dernier argument est le nombre d'octets à définir dans la constante. Parce que chaque emplacement du tableau stocke un entier, nous devons donc passer le nombre total d'octets comme paramètre.
De plus, si vous souhaitez effacer le tableau en zéros, vous pouvez utiliser calloc
au lieu de malloc
. calloc
renverra le bloc de mémoire après avoir mis à zéro les emplacements d'octets alloués.
Une fois que vous avez terminé, libérez le bloc mémoire free (arr)
.
EDIT1
Notez que si vous souhaitez affecter un entier particulier aux emplacements d'un tableau d'entiers à l'aide de memset
, ce sera un problème. En effet, memset
interprètera le tableau comme un tableau d'octets et affectera l'octet que vous avez donné à chaque octet du tableau. Donc, si vous voulez stocker par exemple 11243 dans chaque emplacement, ce ne sera pas possible.
EDIT2
Notez également pourquoi chaque fois que la définition d'un tableau int sur 0 avec memset
peut ne pas fonctionner: Pourquoi "memset (arr, -1, sizeof (arr)/sizeof (int))" n'efface pas un tableau entier à -1? comme l'a souligné @Shafik Yaghmour
À la place d'utiliser
int * p;
p = {1,2,3};
on peut utiliser
int * p;
p =(int[3]){1,2,3};
Vous ne pouvez pas utiliser la syntaxe que vous avez suggérée. Si vous avez un compilateur C99, vous pouvez le faire:
int *p;
p = malloc(3 * sizeof p[0]);
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]);
Si votre compilateur ne prend pas en charge les littéraux composés C99, vous devez utiliser un modèle nommé pour copier à partir de:
int *p;
p = malloc(3 * sizeof p[0]);
{
static const int p_init[] = { 0, 1, 2 };
memcpy(p, p_init, 3 * sizeof p[0]);
}
p = {1,2,3} est faux.
Vous ne pouvez jamais utiliser ceci:
int * p;
p = {1,2,3};
la boucle est bonne
int *p,i;
p = malloc(3*sizeof(int));
for(i = 0; i<3; ++i)
p[i] = i;
Je pense que la façon la plus fastidieuse est la seule façon de le faire. J'ai essayé le premier et il ne se compile pas (après avoir commenté le '...')
Pas beaucoup de raccourcis en 'C' je suppose.