struct x {
char a[10];
char b[20];
int i;
char *c;
char *d[10];
};
Wypełniam tę strukturę, a następnie używam wartości. W następnej iteracji chcę zresetować wszystkie pola do 0
lub null
przed ponownym użyciem.
Jak mogę to zrobić? Czy mogę użyć memset
lub muszę przejść przez wszystkich członków, a następnie zrobić to indywidualnie?
c
struct
initialization
hari
źródło
źródło
memset
jeśli chcę tylko zresetować wszystko do0
??memset
sprawia, że czuję się brudny. Wolę, aby kompilator martwił się o układ pamięci, gdy tylko jest to możliwe. Ściśle mówiąc, takie użyciememset
nie jest przenośne, ale w praktyce zdziwiłbym się, gdybyś kiedykolwiek skompilował swój kod w dowolnym miejscu, które ma znaczenie. Więc prawdopodobnie możesz bezpiecznie używać memset, jeśli wolisz.Sposobem na zrobienie czegoś takiego, gdy masz współczesne C (C99), jest użycie literału złożonego .
a = (const struct x){ 0 };
Jest to trochę podobne do rozwiązania Davida, tyle że nie musisz się martwić o zadeklarowanie pustej struktury lub zadeklarowanie jej
static
. Jeśli użyjesz takconst
jak ja, kompilator może statycznie przydzielić złożony literał w pamięci tylko do odczytu, jeśli to konieczne.źródło
{ 0 }
jako domyślny inicjator. Wyłącz to ostrzeżenie, to fałszywy fałszywy alarm.Lepiej niż wszystko powyżej jest kiedykolwiek użycie standardowej specyfikacji C do inicjalizacji struktury:
struct StructType structVar = {0};
Oto wszystkie bity zero (zawsze).
źródło
{}
w C ++. Twórcy gcc wydają się nie{0}
być pewni, czy C ++ ma obsługiwać i sam nie jestem zaznajomiony z tą częścią standardu.{0}
lub{}
. Nie jestem pewien, czy standardy C i C ++ są jasne i zsynchronizowane w tym problemie, ale najwyraźniej kompilatory nie.struct StructType structVar = malloc (sizeof(StructType)); structVar ={0}
W C powszechnym idiomem jest wyzerowanie pamięci do
struct
użyciamemset
:struct x myStruct; memset(&myStruct, 0, sizeof(myStruct));
Z technicznego punktu widzenia nie uważam, że jest to przenośne, ponieważ zakłada, że
NULL
wskaźnik na maszynie jest reprezentowany przez liczbę całkowitą 0, ale jest szeroko stosowany, ponieważ na większości maszyn tak jest.Jeśli przejdziesz z C do C ++, uważaj, aby nie używać tej techniki na każdym obiekcie. C ++ czyni to legalnym tylko dla obiektów bez funkcji składowych i bez dziedziczenia.
źródło
Jeśli masz kompilator zgodny z C99, możesz użyć
mystruct = (struct x){0};
w przeciwnym razie powinieneś zrobić to, co napisał David Heffernan, tj. zadeklarować:
struct x empty = {0};
A w pętli:
źródło
Możesz użyć
memset
z rozmiarem struktury:struct x x_instance; memset (&x_instance, 0, sizeof(x_instance));
źródło
memset
Jest to opcja, ale kiedy go używać, trzeba upewnić się, że pamięć zapisywany jest dokładnie taki sam rozmiar jak trzeci parametr, dlatego lepiej jest odwołać się do rozmiaru rzeczywistego obiektu, nie wielkość typu ty wiem, że obecnie jest. IOWmemset (&x_instance, 0, sizeof(x_instance));
to znacznie lepszy wybór. BTW:(void*)
rzutowanie jest zbędne również w C ++.Uważam, że możesz po prostu przypisać pusty set (
{}
) do swojej zmiennej.struct x instance; for(i = 0; i < n; i++) { instance = {}; /* Do Calculations */ }
źródło
struct x myX; ... memset(&x, 0, sizeof(myX));
źródło
wprowadź opis zdjęcia tutaj Zaskocz gnu11!
typedef struct { uint8_t messType; uint8_t ax; //axis uint32_t position; uint32_t velocity; }TgotoData; TgotoData tmpData = { 0 };
nic nie jest zerem.
źródło