web-dev-qa-db-fra.com

Initialisation des tableaux dynamiques C

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?

12
user2381799

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

19
phoxis

À la place d'utiliser

int * p;
p = {1,2,3};

on peut utiliser

int * p;
p =(int[3]){1,2,3};
17
EnterKEY

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]);
}
4
caf

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;
3
Lidong Guo

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.

1
user763410