1165 Stimmen

Wie initialisiert man alle Mitglieder eines Arrays auf denselben Wert?

Ich habe ein großes Array in C (nicht C++ falls das einen Unterschied macht). Ich möchte alle Mitglieder mit demselben Wert initialisieren.

Ich könnte schwören, dass ich einmal eine einfache Möglichkeit kannte, dies zu tun. Ich könnte verwenden memset() in meinem Fall, aber gibt es nicht eine Möglichkeit, dies zu tun, die direkt in die C-Syntax eingebaut ist?

6voto

warren Punkte 30258

Für die Initialisierung "normaler" Datentypen (wie int-Arrays) können Sie die Klammerschreibweise verwenden, allerdings werden die Werte nach dem letzten Wert auf Null gesetzt, wenn im Array noch Platz ist:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};

5voto

ddimitrov Punkte 3259

Wenn das Array zufällig int oder irgendetwas mit der Größe von int ist oder die Größe Ihres Mem-Patterns genau in einen int passt (d.h. alle Nullen oder 0xA5A5A5A5), ist der beste Weg die Verwendung von memset() .

Andernfalls rufen Sie memcpy() in einer Schleife auf und verschieben den Index.

5voto

Maciej Punkte 8905

Es gibt einen schnellen Weg, um ein Array eines beliebigen Typs mit einem bestimmten Wert zu initialisieren. Es funktioniert sehr gut mit großen Arrays. Der Algorithmus lautet wie folgt:

  • Initialisierung des ersten Elements des Arrays (üblicher Weg)
  • Kopieren eines bereits gesetzten Teils in einen noch nicht gesetzten Teil, wobei die Größe mit jedem weiteren Kopiervorgang verdoppelt wird

について 1 000 000 Elemente int Array ist es 4-mal schneller als die normale Schleifeninitialisierung (i5, 2 Kerne, 2,3 GHz, 4GiB Speicher, 64 Bit):

loop runtime 0.004248 [seconds]

memfill() runtime 0.001085 [seconds]


#include <stdio.h>
#include <time.h>
#include <string.h>
#define ARR_SIZE 1000000

void memfill(void *dest, size_t destsize, size_t elemsize) {
   char   *nextdest = (char *) dest + elemsize;
   size_t movesize, donesize = elemsize;

   destsize -= elemsize;
   while (destsize) {
      movesize = (donesize < destsize) ? donesize : destsize;
      memcpy(nextdest, dest, movesize);
      nextdest += movesize; destsize -= movesize; donesize += movesize;
   }
}    
int main() {
    clock_t timeStart;
    double  runTime;
    int     i, a[ARR_SIZE];

    timeStart = clock();
    for (i = 0; i < ARR_SIZE; i++)
        a[i] = 9;    
    runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
    printf("loop runtime %f [seconds]\n",runTime);

    timeStart = clock();
    a[0] = 10;
    memfill(a, sizeof(a), sizeof(a[0]));
    runTime = (double)(clock() - timeStart) / (double)CLOCKS_PER_SEC;
    printf("memfill() runtime %f [seconds]\n",runTime);
    return 0;
}

4voto

Hannah Zhang Punkte 439
  1. Wenn Ihr Array als statisch oder global deklariert ist, werden alle Elemente in dem Array bereits den Standardwert 0.
  2. Einige Compiler setzen Arrays im Debug-Modus standardmäßig auf 0.
  3. Es ist einfach, den Standardwert auf 0 zu setzen: int array[10] = {0};
  4. Für andere Werte müssen Sie jedoch memset() oder loop verwenden;

Beispiel: int array[10]; memset(array,-1, 10 *sizeof(int));

3voto

Ratan Raj Punkte 131

Int array[1024] = {[0 ... 1023] = 5}; So wie oben funktioniert es, aber stellen Sie sicher, dass keine Leerzeichen zwischen den ... Punkten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X