• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego nowa dynamiczna tablica zawiera śmieci?

Object Storage Arubacloud
0 głosów
367 wizyt
pytanie zadane 11 sierpnia 2016 w C i C++ przez manjaro Nałogowiec (37,390 p.)

Witam

Mam taki oto problem.

Zauważyłem że jak tworzę dynamicznie tablicę to jest ona pusta. Ale jak zniszczę tablicę i później tworzę ją ponownie to już pusta ona nie jest i zawiera śmieci. Ktoś wyjaśni dlaczego tak się dzieje? Poniżej kod przykładowy. Przy kolejnym wywołaniu pętli tablica zawiera śmieci.

while (testy--){
        unsigned int *tablica, liczba;
        cin >>liczba;
        tablica = new unsigned int [liczba];
      
        // Tutaj jakiś kod programu, nie ma to znaczenia znaczenia

        delete [] tablica;
    }

 

2 odpowiedzi

+2 głosów
odpowiedź 11 sierpnia 2016 przez WaxerStudio Bywalec (2,070 p.)
Dzieje się tak ponieważ, system w pamięci RAM do komórek przypisuje jakieś dane, gdy tworzysz tablicę i dodajesz do niej dane są one wpisywane do poszczególnych komórek RAMu. Gdy usuwasz tablicę i tworzysz nową ale nie wpiszesz do niej danych zawiera śmieci, ponieważ komputer "zażyczył" sobie te komórki, wcześniej używane np. przez inny program, ale nie miał polecenia aby je wyczyścić. Wyświetliłeś po prostu już zbędne dane z innego programu. Podobnie może być ze zwykłymi zmiennymi ale zależne jest to również od tego jakiego kompilatora używasz, niektóre automatycznie zerują dane przy ich definiowaniu.
+1 głos
odpowiedź 11 sierpnia 2016 przez itcloud Gaduła (3,380 p.)
Wydaje mi się, że to że była na początku pusta to fuks, bo powinny w niej być od początku śmieci (jakieś pozostałości w pamięci). Tzn. patrząc na ten fragment kodu, gdy do tablicy nic nie wpisujesz.
komentarz 12 sierpnia 2016 przez draghan VIP (106,230 p.)

Scalars and POD types with dynamic storage duration were considered to be not initialized (since C++11, this situation was reclassified as a form of default initialization).

(...)

Default initialization of non-class variables with automatic and dynamic storage duration produces objects with indeterminate values (static and thread-local objects get zero initialized)

[źródło]

Przyznam szczerze, że w sumie to nie wiem, jak się do tego odnieść. :)

komentarz 13 sierpnia 2016 przez maly Nałogowiec (37,190 p.)

Też mam problem ze zrozumieniem takich kalamburów, jednak w całej dokumentacji nie znalazłem żadnego odniesienia dotyczącego inicjalizacji dynamicznych tablic oprócz

int* a = new int[10](); // array => value-initialization of each element
						//          the value of each element is 0

 

komentarz 13 października 2016 przez m_rij_v Użytkownik (660 p.)
W takim razie, dlaczego mi kompilując wyskakuje syf, zamiast tego co wpisuję ?

WEJŚCIE w programie:

liczba testów t

liczba n-tych liczb do przesunięcia o 1 w lewo i po spacji w tej samej linii owe liczby

WYJŚCIE

liczba n-tych wyrazów ,,zrolowanych" każdy przypadek w nowej linii

PRZYKŁAD (wejscie)

2

3 1 2 3

6 3 2 1 5 6 7

(wyjście)

2 3 1

2 1 5 6 7 3

#include <iostream>
using namespace std;

int main()
{
    int t;
    cout << "Podaj liczbe testow: " << endl;
    cin>>t;
    string *tab;
    tab=new string[t];

    for (int k=0;k<t;k++)
    {
        int n;
        cin>>n;
        char *p;
        p=new char[n];

        for(int j=0;j<n;j++)
        {
            cin>>p[j];
        }
        char bufor=p[0];
        for(int j=0;j<n;j++)
        {
            if(j==(n-1))
            {
                p[j]=bufor;
            }
            else
            {p[j]=p[j+1];}

        }

        tab[k]=p;
        delete [] p;
    }
    for(int d=0;d<t;d++)
    {
       string zmienna=tab[d];
       for(int i=0;i<zmienna.length();i++)
       {
        cout<<zmienna[i]<<" ";
       }
       cout<<endl;
    }

    delete [] tab ;
    return 0;
}

Dzięki za odpowiedź tutaj, nie chciałam tworzyć nowego tematu/problemu..;]
komentarz 13 października 2016 przez manjaro Nałogowiec (37,390 p.)

Nie chcę mi się analizować tego programu, bo nie wiem czy jest sens, jeśli wyniki testów są prawidłowe ;)

Ale na SPOJu to nie przejdzie bo nie może być tego cout << "Podaj liczbe testow: " << endl;
 

 

komentarz 14 października 2016 przez m_rij_v Użytkownik (660 p.)
Cout faktycznie nie usunęłam przed wstawieniem tego tutaj, ale mniejsza o to ( bo to wiem), lecz nie działa program gdy go skompilujesz normalnie na swoim kompie , ponieważ wyrzuca mi syf oprócz zmienionych poprawnie cyfr ...więc coś jest nie tak.

Błąd najprawdopodobniej powstaje w momencie tworzenia LOKALNEJ dynamicznej tablicy, tam wskaźnik p , ustawia się automatycznie na komórki które nie są puste, tylko właśnie na syf i nie wiem jak to zmienić, aby było ,,czysto" tak samo jak to jest gdy tworzymy globalne zmienne.

Wrzucając do spoja ( po usunięciu cout) też wyskakuje mi błąd.

Podobne pytania

0 głosów
2 odpowiedzi 774 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez four Użytkownik (720 p.)
0 głosów
2 odpowiedzi 512 wizyt
pytanie zadane 4 października 2018 w C i C++ przez uther1455 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 268 wizyt

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...