manpage mówi o memset
:W jaki sposób zestaw danych inicjalizuje tablicę liczb całkowitych przez -1?
#include <string.h> void *memset(void *s, int c, size_t n)
Funkcja
memset()
wypełnia pierwsząn
bajtów obszaru pamięci wskazywanego przezs
ze stałą bajtc
.
Jest oczywiste, że memset
nie może być używany do inicjalizacji int
tablicy, jak pokazano poniżej:
int a[10];
memset(a, 1, sizeof(a));
to dlatego int
reprezentuje 4 bajty (powiedzmy) i nie można uzyskać pożądany wartość dla liczb całkowitych w tablicy a
.
Ale często widzę, że programiści używają memset
, aby ustawić elementy tablicowe int
na 0
lub -1
.
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
Według mojego rozeznania, inicjowanie z całkowitą 0
jest OK bo 0
mogą być reprezentowane w 1 bajt (może się mylę w tym kontekście). Ale jak można zainicjować b
z -1
(wartość 4 bajtów)?
Dół, staraj się wyjaśnić? Czy to pytanie jest nieistotne dla tej witryny lub czegoś innego? – haccks
Nieco mylisz się z powodu inicjalizacji z '0' jest OK. Jest OK, ponieważ '0' mieści się w' unsigned char' (więc nie jest obcięte gdy jest używany jako drugi argument 'memset') * i * ponieważ wzorzec bitowy w pamięci dla' sizeof (int) '-byte zero jest identyczne z wzorcem bitów w pamięci dla 'sizeof (int)' z kolei jedno bajtowe zera. Obie te rzeczy muszą być prawdziwe, aby to zadziałało. Rzeczywiście, te rzeczy są prawdziwe dla dokładnie dwóch liczb w arytmetyce dwójkowej-uzupełniającej: '0' i' -1'. – zwol