Comment initialiser le tableau dynamicment avec une valeur par défaut?

J’étais en train d’initialiser un tableau (unsigned short int) de taille 100000000 en C 4.3.2, ainsi que deux autres tableaux int de taille 1000000. Mais lors de la soumission sur le juge Online, l’erreur SIGSEGV était générée .

Par conséquent, j’ai décidé d’initialiser mon tableau de manière dynamic avec une valeur par défaut de 0, car l’ajout de valeur par boucle prend beaucoup de temps.

Ma question est de savoir comment initialiser le tableau dynamicment avec une valeur par défaut?

Vous pouvez utiliser void *calloc(size_t nmemb, size_t size); fonction pour initialiser la mémoire avec 0 ,

La fonction calloc() alloue de la mémoire à un tableau d’éléments nmemb de taille octets et renvoie un pointeur sur la mémoire allouée. La mémoire est mise à zero . Si nmemb ou size est nmemb 0 , calloc() renvoie NULL ou une valeur de pointeur unique pouvant ultérieurement être transmise à free() .

  calloc(number of elements, sizeof(type)); 

ou vous pouvez également utiliser explicitement memset() pour initialiser la mémoire allouée par l’appel de malloc() .

Remarque: calloc() n’est pas magique non plus – il utilisera également une boucle quelque part pour remplacer la poubelle par des zéros.

Voir aussi: Pourquoi malloc() + memset() est plus lent que calloc() ?

Vous ne pouvez pas éliminer le temps d’initialisation, peu importe ce que vous faites. Le mieux que vous puissiez faire est d’essayer de l’ optimiser . 2 techniques me viennent à l’esprit:

  • Utilisez efficacement votre matériel. Utilisez des access mémoire de taille native pour initialiser le tampon. Par exemple, sur une architecture en architecture 32 bits et écrivez par blocs de 4 octets.
  • Déroulez la boucle pour éliminer la surcharge de contrôle.

Le déroulement sera probablement appliqué de toute façon en optimisant le compilateur.

Vous pouvez également essayer de déplacer la surcharge d’initialisation vers une section non critique. Par exemple, vous pouvez utiliser des variables statiques qui seront initialisées à zéro au démarrage du programme. Ou, au contraire, vous pouvez différer l’initialisation jusqu’à la première utilisation (initialisation différée).