2013-10-31 6 views
6

Ich versuche, mit memset auf einem reinen 2D-Array, das folgende Stück Code:Memset arbeiten nicht

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int l[3][3]; 
    memset (l, 1, sizeof(l)); 
    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      cout << l[i][j] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

Ich möchte das gesamte Array von 1 unter Verwendung der Leitung initialisiert werden:

memset (l, 1, sizeof (l));

Aber ich habe nicht den erwarteten Wert erhalten, gibt es mir die folgende Ausgabe:

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

es gedacht, könnte ein Problem mit dem Compiler, so dass ich versuchte, mit Ideone:

http://ideone.com/VFYUDg

Bitte helfen Sie.

Antwort

17

memset Werke auf Bytes, so dass es Ihr Array von ints mit 0x01010101 Werten füllt (unter der Annahme int 32 Bit), die 16843009.

dezimal Wenn Sie einen 2-dimensionale C-Stil-Array mit einem füllen müssen Nummer:

int l[3][3]; 
std::fill_n(*l, sizeof l/sizeof **l, 1); 

*l hier abklingt int[3][3] in einen Zeiger auf das erste Element des Arrays (int*) sizeof l/sizeof **l ergibt die Anzahl der Array-Elemente.

Es verwendet die C++ - Anforderung, dass Arrays zusammenhängend im Speicher ohne Lücken angeordnet werden, so dass mehrdimensionale Arrays das gleiche Layout wie eindimensionale Arrays haben. Z.B. int [3][3] hat das gleiche Layout wie int[3 * 3].

Und im Gegensatz zu memset, std::fill_n arbeitet auf Objektebene, nicht auf Bytes. Für eingebaute Typen wird die optimierte Version normalerweise als SIMD-Befehle inline, nicht weniger effizient als memset.

+0

also, wenn ich das ganze Array mit sagen ganzen Wert 1 oder 2 initialisieren wollte, was sollte ich verwenden? – shivshnkr

+0

@ user123456 Verwenden Sie 'std :: fill' oder' std :: fill_n'. –

4

Eigentlich ist es sehr gut funktioniert ...

16843009 ist die Dezimaldarstellung 0x01010101 (hex).

memset hat seinen Job richtig gemacht, d. H. Es hat jedes Byte in dem bereitgestellten Speicherbereich auf 0x01 initialisiert.

+0

so wie memset verwenden, um mein Array zu einem ganzzahligen Wert als 0 zu initialisieren? – shivshnkr

+0

@ user123456 'memset' wird __alls__ auf Byte-Basis arbeiten. Daher können Sie Ihr Array nur mit einem periodischen Byte-Muster initialisieren. – Rerito

-2

Wenn Ihr Ziel ist es, jedes Element des Arrays auf 1 zu setzen, dann wird folgende Ihre Arbeit tun,

int l [3] [3] = {1,1,1,1,1,1 , 1,1,1};