Dois-je appeler memset après que j'ai attribué de nouvelles de la mémoire avec malloc
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
int *test = malloc(15 * sizeof(int));
for(int i = 0;i < 15 ;i ++ )
printf("test is %i\n",test[i]);
memset(test,0,sizeof(int) * 15);
for(int i = 0 ; i < 15; i ++ )
printf("test after memset is %i\n",test[i]);
return 0;
}
La sortie j'obtiens, c'est très bizarre:
test is 1142126264
test is 32526
...
test is 1701409394
test is 1869348978
test is 1694498930
test after memset is 0
test after memset is 0
test after memset is 0
test after memset is 0
test after memset is 0
...
test after memset is 0
test after memset is 0
test after memset is 0
test after memset is 0
test after memset is 0
Pourquoi c'est arrivé?
J'ai pensé que je viens de malloc
ed quelques nouvelles fraîches de la mémoire qui est prêt à l'emploi?
Alors, comment à ce sujet:
int test[15];
Dois-je appeler
memset(&test,0,sizeof(int) * 15);
?
L'initialisation de tous les bits de la mémoire serait de ralentir les programmes qui n'en ont pas besoin. Je pense que
calloc
servirait si vous avez besoin il remis à zéro.OriginalL'auteur steave | 2012-11-16
Vous devez vous connecter pour publier un commentaire.
malloc
ne pas initialiser la mémoire, qu'il alloue. Vous venez de le faire quel que soit aléatoire d'ordures était déjà là. Si vous avez vraiment besoin de tout régler à 0, l'utilisationcalloc
à une perte de performance. (Si vous avez besoin d'initialiser à quelque chose d'autre que 0, utilisermemset
pour les tableaux d'octets et sinon manuellement en boucle sur le tableau pour l'initialiser.)Il n'est pas plus rapide, mais vous pouvez initialiser à une valeur quelconque, et pas seulement à zéro.
c'est vrai que pour des tableaux d'octets. vous ne devriez pas utiliser malloc pour initialiser un tableau de
int
s à autre chose que 0Bon point, je vais modifier.
eh bien, techniquement, il ne serait pas un problème à malloc() les déchets de toute façon si vous êtes immédiatement aller remplir ce tableau.
OriginalL'auteur 1''
C11 7.22.3.4
Si vous voulez que les valeurs à zéro, utilisez
calloc
à la place.calloc
est fondamentalement juste une fonction wrapper autour d'un appel àmalloc
et un appel àmemset
(avec la valeur est 0).OriginalL'auteur Lundin
Lorsque vous demandez pour un mémoire de tas, tas juste allouer un bloc de mémoire disponible. Ce bloc de mémoire peut disposer de certaines données en fonction d'un précédent écrire.
OriginalL'auteur Jay
Pour des raisons de performances, malloc() ne fait aucune garantie concernant le contenu de la mémoire nouvellement allouée. Il pourrait être des zéros, il pourrait être aléatoire des données, il pourrait être n'importe quoi. Si vous voulez malloc ed de mémoire pour avoir une valeur spécifique, alors il est à vous de le faire.
OriginalL'auteur jdigital