it-swarm.com.de

Verwenden von memset für ein ganzzahliges Array in c

char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);

output:
******ful earth

1) Wie bei der Verwendung von memset können wir nur einige ganzzahlige Array-Indexwerte auf 1 wie unten angegeben initialisieren?

int arr[15];
memset(arr,1,6);
24
user1762571

Nein, Sie können memset() nicht so verwenden. Die manpage sagt (Hervorhebung meines):

Die Funktion memset() füllt die ersten nbytes des Speicherbereichs, auf den s zeigt, mit dem konstanten Byte c.

Da ein int normalerweise aus 4 oder 8 Bytes besteht, wird dies nicht abgeschnitten.


Wenn Sie (falsch !!) versuchen, dies zu tun:

int arr[15];
memset(arr, 1, 6*sizeof(int));    //wrong!

dann werden die ersten 6 ints im Array tatsächlich auf 0x01010101 = 16843009 gesetzt.

Das einzige Mal, dass es wirklich akzeptabel ist, über einen "Blob" von Daten mit Nicht-Byte-Datentypen zu schreiben, ist memset(thing, 0, sizeof(thing));, um die gesamte Struktur/das gesamte Array zu "nullen". Das funktioniert, weil NULL, 0x00000000, 0.0, alle vollständig Nullen sind.


Die Lösung ist, eine for-Schleife zu verwenden und selbst einzustellen:

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

Kurze Antwort, nein. 

Lange Antwort, memset setzt Bytes und funktioniert für Zeichen, da sie einzelne Bytes sind, ganze Zahlen jedoch nicht. 

12
vidit

Das dritte Argument von Memset ist die Byte-Größe. Sie sollten also die Gesamtbytegröße von arr[15] einstellen.

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

Wahrscheinlich sollten Sie jedoch den Wert 1 für ganze Elemente in arr festlegen. Dann ist es besser, sich in die Schleife zu setzen.

for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
    arr[i] = 1;
}

Weil memset() in jedem Byte 1 gesetzt ist. Es ist also nicht deine Erwartung.

3
mattn

Unter Linux, OSX und anderen UNIX-ähnlichen Betriebssystemen, bei denen wchar_t 32 Bit ist und Sie wmemset() anstelle von memset() verwenden können.

#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );

Beachten Sie, dass wchar_t unter MS-Windows 16 Bit umfasst, sodass dieser Trick möglicherweise nicht funktioniert.

3
ceilingcat

Nein, Sie können memset nicht [portabel] für diesen Zweck verwenden, es sei denn, der gewünschte Zielwert ist 0. memset behandelt den Zielspeicherbereich als ein Array von Bytes und nicht als ein Array von ints.

Ein ziemlich beliebter Hack zum Füllen eines Speicherbereichs mit einem sich wiederholenden Muster basiert auf memcpy. Es setzt kritisch auf die Erwartung, dass memcpy Daten in Vorwärtsrichtung kopiert

int arr[15];

arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);

Dies ist natürlich ein ziemlich hässlicher Hack, da das Verhalten des Standards memcpy nicht definiert ist, wenn sich die Quell- und Zielspeicherbereiche überlappen. Sie können jedoch auch Ihre eigene Version von memcpy schreiben und sicherstellen, dass die Daten in Vorwärtsrichtung kopiert und auf die oben beschriebene Weise verwendet werden. Aber es lohnt sich nicht wirklich. Verwenden Sie einfach einen einfachen Zyklus, um die Elemente Ihres Arrays auf den gewünschten Wert zu setzen.

1
AnT

Memset setzt Werte für Datentypen mit 1 Byte, aber ganze Zahlen haben 4 Bytes oder mehr, daher funktionieren sie nicht und Sie erhalten Müllwerte ... Diese werden meistens beim Arbeiten mit Zeichen- und Zeichenfolgentypen verwendet.

0

Da hat es niemand erwähnt ...

Obwohl Sie die Ganzzahlen nicht mit dem Wert 1 mit memset initialisieren können, können Sie can mit dem Wert -1 initialisieren und stattdessen einfach Ihre Logik so ändern, dass sie mit negativen Werten arbeitet.

Um beispielsweise die ersten 6 Zahlen Ihres Arrays mit -1 zu initialisieren, müssen Sie dies tun

memset(arr,-1,6*(sizeof int));

Wenn Sie diese Initialisierung nur einmal durchführen müssen, können Sie das Array außerdem so konfigurieren, dass es ab der Kompilierzeit mit den Werten 1 beginnt.

int arr[15] = {1,1,1,1,1,1};
0
i Code 4 Food

Idealerweise können Sie memset nicht verwenden, um Ihren Arrary auf 1 einzustellen.
Weil memset auf Byte arbeitet und jedes Byte auf 1 setzt.

memset(hash, 1, cnt);

Nach dem Lesen wird der Wert angezeigt: 16843009 = 0x01010101 = 1000000010000000100000001
Nicht 0x00000001
Wenn Ihre Anforderung nur für Bool oder Binärwert ist, können Sie den C99-Standard für die C-Bibliothek festlegen

#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;
}

Ausgabe:

Hallo Welt!
1 1 1 1 1 

0
akD

Ich habe folgendes Programm ausprobiert und es scheint, dass Sie Ihr Array mit memset () nur mit -1 und 0 initialisieren können 

#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
ganjaam