C - czy trzeba domyślnie zerować tablice znakowe o statycznym rozmiarze?

0

Witam,
Wiem, że dynamiczne tablice znakowe w C rezerwowane za pomocą malloc nie są domyślnie zerowane (można użyć calloc albo malloc + bzero). Jak to się ma do tablic statycznych o rozmiarze n? Czy kompilator gwarantuje, że składają się z samych zer czy też trzeba je potraktować bzero dla pewności?

Pozdrawiam,

0

Statycznych tablic nie trzeba ręcznie zerować.

0

To zależy, jeżeli to są zmienne globalne to są inicjowane zerami, jeżeli lokalne to takiej pewności nie ma.

0

Ok, czyli zeruje tylko lokalne zmienne tablicowe. Dzięki.

0

jeśli zaraz potem będzie sprintf do tej tablicy albo coś podobnego, to i zerować nie trzeba…

0

W tym temacie objawia się pierwszy sygnał poważnej schizofrenii u twórców C/C++.

  • zmienne globalne - tak, są inicjowane
  • zmienne na stosie (lokalne) - nie
  • obszary po malloc - nie
  • obszary po new - nie * http:*www.cplusplus.com/forum/beginner/944/
  • obiekty po new - tak
1

Dobrze jest inicjalizować zawsze i żyć spokojnie :P

0

ma to uzasadnienie:

  1. globalne: to nic nie kosztuje, minimalne spowolnienie ładowania się programu (albo żadne, jeśli to system operacyjny zeruje)
  2. lokalne: byłoby za dużym marnotrawstwem, nie zawsze potrzebujemy zerowania jeśli zaraz przypisujemy tam jakąś wartość.
  3. malloc nie, ale calloc tak. możesz sobie wybrać.
  4. jak w punkcie 2.
  5. i tylko tu mamy lekką schizofrenię

dla porównania C#:

  1. brak globalnych, są pola ale te podpadają pod punkt 5.
  2. lokalne nie są zerowane, ale kompilator nie pozwoli nam na odczytanie niezainicjowanej wartości (czasem to przeszkadza). podobnie alokacja przez stackalloc (bezpośredni odpowiednik tablicy w C) nie zeruje pamięci.
  3. brak potrzeby ręcznej alokacji pamięci, ale jak ktoś potrzebuje, to AllocHGlobal również nie zeruje obszaru
  4. trudno o bezpośredni odpowiednik; zarządzane tablice są zerowane, ale to bardziej punkt 5.
  5. jak w C.

jak widzimy, w większości przypadków mamy takie samo zachowanie.

0
Azarien napisał(a)

(ciach)
2. lokalne nie są zerowane, ale kompilator nie pozwoli nam na odczytanie niezainicjowanej wartości (czasem to przeszkadza). podobnie alokacja przez stackalloc (bezpośredni odpowiednik tablicy w C) nie zeruje pamięci.

Tu jest nieścisłość. Kompilator przepuszcza takie odczyty (być może daje warning, chociaż wątpie), program wywala się dopiero w czasie działania - ale zdaje się tylko w trybie debug?

W Visual C++ niezainicjowane zmienne można wykryć - mają specyficzne wartości (kompilator się o to troszczy - w trybie debug). Z tego co pamiętam, wstawiane są automatem kody sprawdzające takie odczyty.

0

Tu jest nieścisłość. Kompilator przepuszcza takie odczyty (być może daje warning, chociaż wątpie), program wywala się dopiero w czasie działania - ale zdaje się tylko w trybie debug?

stackalloc jest unsafe. zauważ, że zwracana zmienna jest tylko wskaźnikiem (np. int*) więc nawet indeksy nie są sprawdzane i możesz bez problemu wyjechać poza zasięg i wywalić program.
w momencie użycia unsafe, wyłączasz mechanizmy kontrolne i bierzesz na siebie odpowiedzialność, że kod jest prawidłowy. w C jesteś zawsze w trybie „unsafe”.

1 użytkowników online, w tym zalogowanych: 0, gości: 1