Pomyślałem, że ustawienie pierwszego elementu na wartość null wyczyści całą zawartość tablicy char.
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
Jednak to ustawia tylko pierwszy element na null.
lub
my_custom_data[0] = 0;
Zamiast używać memset
, pomyślałem, że powyższe 2 przykłady powinny wyczyścić wszystkie dane.
Odpowiedzi:
To zależy od tego, jak chcesz wyświetlić tablicę. Jeśli patrzysz na tablicę jako serię znaków, jedynym sposobem na wyczyszczenie danych jest dotknięcie każdego wpisu.
memset
jest prawdopodobnie najskuteczniejszym sposobem osiągnięcia tego celu.Z drugiej strony, jeśli zdecydujesz się wyświetlić ten ciąg znaków C / C ++ zakończony znakiem null, ustawienie pierwszego bajtu na 0 skutecznie wyczyści ciąg.
źródło
Tablica w C jest po prostu miejscem w pamięci, więc rzeczywiście, twoje
my_custom_data[0] = '\0';
przypisanie po prostu ustawia pierwszy element na zero i pozostawia pozostałe elementy nienaruszone.Jeśli chcesz wyczyścić wszystkie elementy tablicy, musisz odwiedzić każdy element. Do tego
memset
służy:Jest to na ogół najszybszy sposób rozwiązania tego problemu. Jeśli możesz użyć C ++, rozważ zamiast tego std :: fill:
źródło
Dlaczego myślisz, że ustawienie pojedynczego elementu wyczyści całą tablicę? Zwłaszcza w języku C niewiele dzieje się bez bezpośredniego zaprogramowania przez programistę. Jeśli ustawisz pierwszy element na zero (lub dowolną wartość), to zrobiłeś dokładnie to i nic więcej.
Podczas inicjalizacji możesz ustawić tablicę na zero:
Poza tym nie znam żadnej innej techniki niż memset lub coś podobnego.
źródło
Posługiwać się:
Lub:
źródło
memset(my_custom_data, 0, strlen(my_custom_data));
) wyczyści tylko do pierwszego „\ 0”, który może znajdować się poza końcem tablicy. To może, ale nie musi, być w porządku.Wypróbuj następujący kod:
źródło
Dlaczego nie użyć
memset()
? Tak to się robi.Ustawienie pierwszego elementu pozostawia resztę pamięci nietkniętą, ale funkcje str będą traktować dane jako puste.
źródło
Pls znaleźć poniżej, gdzie wyjaśniłem dane w tablicy po przypadku 1 i przypadku 2.
Przypadek 1:
Wynik:
Przypadek 2:
Wynik:
Chociaż ustawienie pierwszego argumentu na NULL załatwi sprawę, zalecane jest użycie memset
źródło
Nie. Jedyne, co robisz, to ustawienie pierwszej wartości na „\ 0” lub 0.
Jeśli pracujesz z ciągami zakończonymi znakiem null, w pierwszym przykładzie otrzymasz zachowanie, które naśladuje to, czego oczekujesz, jednak pamięć jest nadal ustawiona.
Jeśli chcesz wyczyścić pamięć bez używania memset, użyj pętli for.
źródło
Powinieneś użyć memset. Ustawienie tylko pierwszego elementu nie zadziała, musisz ustawić wszystkie elementy - jeśli nie, to jak ustawić tylko pierwszy element na 0?
źródło
Zapisanie pustego znaku do pierwszego znaku właśnie to robi. Jeśli potraktujesz go jako łańcuch, kod przestrzegający znaku zakończenia zerowego potraktuje go jako łańcuch pusty, ale to nie to samo, co wyczyszczenie danych. Jeśli chcesz faktycznie wyczyścić dane, musisz użyć memset.
źródło
Zwykle po prostu robię to:
źródło
To nie jest poprawne, jak odkryłeś
Dokładnie!
Musisz użyć memset, aby wyczyścić wszystkie dane, nie wystarczy ustawić jeden z wpisów na null.
Jeśli jednak ustawienie elementu tablicy na wartość null oznacza coś specjalnego (na przykład przy użyciu ciągu kończącego wartość null w), może wystarczyć ustawienie pierwszego elementu na wartość null. W ten sposób każdy użytkownik tablicy zrozumie, że jest ona pusta, mimo że tablica nadal zawiera stare znaki w pamięci
źródło
ustaw pierwszy element na NULL. wypisanie tablicy char nic ci nie da.
źródło
A co z następującymi:
źródło
źródło
Spróbuj wykonać następujące czynności:
źródło