Utilisation de memset pour un tableau entier en c
char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);
output:
******ful earth
1) comme ci-dessus l'utilisation de memset, pouvons-nous initialiser seulement quelques valeurs d'index de tableau entier à 1 comme indiqué ci-dessous??
int arr[15];
memset(arr,1,6);
10 réponses
Non, vous ne pouvez pas utiliser memset()
comme ceci. La page de manuel dit (je souligne):
Le
memset()
function remplit la premièren
octets de la zone mémoire pointée pars
, avec la constante bytec
.
Comme un int
est généralement de 4 ou 8 octets, cela ne le coupera pas.
Si vous (incorrectement!!) essayez de faire ceci:
int arr[15];
memset(arr, 1, 6*sizeof(int)); //wrong!
Alors les 6 premiers int
s du tableau seront en fait définis sur 0x01010101 = 16843009.
La seule fois où il est vraiment acceptable d'écrire sur un "blob" de données avec des types de données non-octets, c'est memset(thing, 0, sizeof(thing));
pour "zéro" tout le struture/tableau. Cela fonctionne parce que NULL, 0x00000000, 0.0, sont tous complètement zéros.
La solution consiste à utiliser une boucle for
et à la définir vous-même:
int arr[15];
int i;
for (i=0; i<6; ++i) // Set the first 6 elements in the array
arr[i] = 1; // to the value 1.
Réponse courte, non.
Réponse longue, memset
définit les octets et fonctionne pour les caractères car ce sont des octets simples, mais pas des entiers.
Le troisième argument de memset est la taille des octets. Vous devez donc définir la taille totale des octets de arr[15]
memset(arr, 1, sizeof(arr));
Cependant, vous devriez probablement vouloir définir la valeur 1 sur des éléments entiers dans arr. Ensuite, vous avez mieux de mettre dans la boucle.
for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
arr[i] = 1;
}
Parce que memset()
Définir 1 dans chaque octet. Il n'est donc pas prévue.
Sur Linux, OSX et D'autres systèmes D'exploitation de type UNIX où wchar_t
est 32 bits et vous pouvez utiliser wmemset()
au lieu de memset()
.
#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
Notez que wchar_t
sur MS-Windows est 16 bits, donc cette astuce peut ne pas fonctionner.
Non, vous ne pouvez pas utiliser [portably] memset
à cette fin, sauf si la valeur cible souhaitée est 0
. memset
traite la région de mémoire cible comme un tableau d'octets, pas un tableau de int
s.
Un hack assez populaire pour remplir une région de mémoire avec un motif répétitif est en fait basé sur memcpy
. Il repose de manière critique sur l'attente que memcpy
copie les données vers l'avant
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
Ceci est, bien sûr, un hack assez laid, puisque le comportement de la norme memcpy
est indéfini lorsque les régions de mémoire source et de destination se chevauchent. Vous pouvez cependant écrire votre propre version de memcpy
, en vous assurant qu'elle copie les données en avant et les utilise de la manière ci-dessus. Mais il n'est pas vraiment la peine. Il suffit d'utiliser un cycle simple pour définir les éléments de votre tableau à la valeur désirée.
Puisque personne ne l'a mentionné...
Bien que vous ne puissiez pas initialiser les entiers avec value 1
en utilisant memset, vous pouvez les initialiser avec value -1
et simplement changer votre logique pour travailler avec des valeurs négatives à la place.
Par exemple, Pour initialiser les 6 premiers chiffres de votre tableau avec -1
, vous feriez
memset(arr,-1,6*(sizeof int));
De plus, si vous n'avez besoin de faire cette initialisation qu'une seule fois, vous pouvez réellement déclarer le tableau pour commencer par les valeurs 1
à partir de la compilation temps.
int arr[15] = {1,1,1,1,1,1};
Memset définit des valeurs pour les types de données ayant 1 octet mais les entiers ont 4 octets ou plus, donc cela ne fonctionnera pas et vous obtiendrez des valeurs inutiles. Il est principalement utilisé lorsque vous travaillez avec des types char et string.
J'ai essayé le programme suivant et il semble que vous pouvez initialiser votre tableau en utilisant memset() avec -1 et 0 seulement
#include<stdio.h>
#include<string.h>
void printArray(int arr[], int len)
{
int i=0;
for(i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
int main()
{
int arrLen = 15;
int totalNoOfElementsToBeInitialized = 6;
int arr[arrLen];
printArray(arr, arrLen);
memset(arr, -1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 0, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, -2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
return 0;
}
Idéalement, vous ne pouvez pas utiliser memset pour définir votre arrary sur all 1.
parce que memset fonctionne sur octet et définit chaque octet à 1.
memset(hash, 1, cnt);
Donc, une fois lu, la valeur, il affichera 16843009 = 0x01010101 = 1000000010000000100000001
Pas 0x00000001
Mais si votre requiremnt est seulement pour bool ou la valeur binaire alors nous pouvons définir en utilisant la norme C99 pour la bibliothèque C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h> //Use C99 standard for C language which supports bool variables
int main()
{
int i, cnt = 5;
bool *hash = NULL;
hash = malloc(cnt);
memset(hash, 1, cnt);
printf("Hello, World!\n");
for(i=0; i<cnt; i++)
printf("%d ", hash[i]);
return 0;
}
Sortie:
Bonjour, Monde!
1 1 1 1 1