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);
24
demandé sur user1762571 2013-06-25 07:51:15

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ère n octets de la zone mémoire pointée par s, avec la constante byte c.

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.
35
répondu Jonathon Reinhart 2013-06-25 04:13:02

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.

12
répondu vidit 2013-06-25 03:54:50

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.

3
répondu mattn 2013-06-25 03:55:04

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.

3
répondu ceilingcat 2017-10-27 10:26:15

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 ints.

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.

1
répondu AnT 2013-06-25 04:43:07

Puisque personne ne l'a mentionné...

Bien que vous ne puissiez pas initialiser les entiers avec value 1en 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};
0
répondu i Code 4 Food 2013-06-25 04:13:11

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.

0
répondu Himanshu Singhvi 2017-04-27 15:34:12

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;
}
0
répondu ganjaam 2018-06-23 06:58:00

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

0
répondu akD 2018-09-23 06:25:02
memset((char *)&tab, 0, sizeof(tab));
-5
répondu user3210859 2014-10-14 10:52:54