48 votes

Pourquoi "memset(arr, -1, sizeof(arr)/sizeof(int))" ne vide pas un tableau d'entiers à -1 ?

N'est-il pas possible d'utiliser memset sur un tableau d'entiers ? J'ai essayé ce qui suit memset et n'a pas obtenu les valeurs entières correctes dans le fichier int le tableau.

int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));

Les valeurs que j'ai obtenues sont :

arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0

82voto

Ioan Paul Pirau Points 1502

Il suffit de passer à memset (arr, -1, sizeof(arr));

Notez que pour d'autres valeurs que 0 et -1, cela ne fonctionnera pas. depuis memset définit les valeurs des octets pour le bloc de mémoire qui commence à la variable indiquée par *ptr pour les éléments suivants num octets.

void * memset ( void * ptr, int value, size_t num );

Et comme int est représentée sur plus d'un octet, vous n'obtiendrez pas la valeur souhaitée pour les entiers de votre tableau.

Exceptions :

  • 0 est une exception puisque, si vous mettez tous les octets à 0, la valeur sera zéro.

  • -1 est une autre exception puisque, comme Patrick l'a souligné, -1 est 0xff (=255) en int8_t et 0xffffffff en int32_t.

La raison que tu as :

arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0

C'est parce que, dans votre cas, la longueur d'un int est de 4 octets (représentation 32 bits), la longueur de votre tableau en octets étant de 20 (=5*4), et vous n'avez mis que 5 octets à -1 (=255) au lieu de 20.

39voto

Sander De Dycker Points 6074

N'utilisez pas memset pour initialiser autre chose que des types de données à un seul octet.

À première vue, il pourrait sembler que cela devrait fonctionner pour initialiser un int a 0 ou -1 (et sur de nombreux systèmes, cela fonctionnera), mais alors vous ne tenez pas compte de la possibilité de générer une représentation piège, provoquant un comportement non défini, ou du fait que la représentation entière est pas nécessairement le complément à deux .

La manière correcte d'initialiser un tableau de int a -1 est de boucler sur le tableau, et de définir chaque valeur explicitement.

11voto

user3083539 Points 27

Gcc fournit un bon raccourci d'initialisation de tableau

int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}

attention à l'espace avant et après ...

5voto

Rudy Velthuis Points 11477

Pourquoi cette division ?

memset(arr, -1, sizeof(arr));

Votre version, sizeof(arr)/sizeof(int) vous donne le nombre d'éléments dans le tableau.

4voto

Bo Persson Points 42821

Vous pouvez vous épargner quelques saisies en initialisant directement le tableau :

int arr[5] = {-1, -1, -1, -1, -1}; 

Cette ligne est plus courte que le memset, et elle fonctionne également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X