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

dynamiczna tablica znaków; program przestaje odpowiadać

0 głosów
368 wizyt
pytanie zadane 2 października 2018 w C i C++ przez Erfik878 Początkujący (310 p.)
edycja 2 października 2018 przez Erfik878

Witam, mam problem z poniższym kodem

#include <iostream>
#include <string>

using namespace std;



int main()
{
    string napis;
    while(1)
    {
        int wielkosc_tablicy;
        char * tablica_znakow = NULL;
        cin>>wielkosc_tablicy;
        tablica_znakow = new char [wielkosc_tablicy];
        for (int i =0; i<wielkosc_tablicy; i++)
        {
            if ((i+1)%2 == 0)               // dowolny kod zapisujacy znak do tablicy
                tablica_znakow[i] = '_';     
            else
                tablica_znakow[i] = '-';
        }
        tablica_znakow[wielkosc_tablicy] = '\0';
        napis = tablica_znakow;
        cout << napis <<endl;
        delete [] tablica_znakow;
    }
}

(proszę nie zwracać uwagi na nieskończoną pętle, specjalnie dałem taką na potrzeby testów)

po uruchomieniu, program przez jakiś czas działa normalnie tzn. pobiera wartość i zwraca ciąg znaków. Niekiedy w losowych momentach po wpisaniu specyficznej liczby (głównie liczby 16, 32 ale nie tylko), program przestaje odpowiadać.Nie ma określonej reguły na to jak trzeba wpisać te liczby, ani za którym razem program przestanie działać. Co ciekawe, przy debugowaniu wszystko działa bez zarzutów, nawet przy specyficznych liczbach. Moje pytania to:

1. Czy sposób w jaki przypisuje dynamiczną tablicę do zmiennej string jest poprawny?

2. Co może być (lub jest) przyczyną takiego zachowania?

Dodam jeszcze że podobny kod był uruchamiany przez Code::blocks wersja 17.12 i Dev-c++ (nie wiem czy ma to jakieś znaczenie), na dwóch różnych komputerach i efekt jest ten sam.

1 odpowiedź

0 głosów
odpowiedź 2 października 2018 przez Poczprogramista123 Bywalec (2,900 p.)
wybrane 2 października 2018 przez Erfik878
 
Najlepsza
tablica_znakow[wielkosc_tablicy] ///!!! Blad

Pamietaj ze tablice numerowane sa od zera i takim zapisem chcesz przypisac jakas wartosc do czegos czego nie ma.
komentarz 2 października 2018 przez Secrus Nałogowiec (32,880 p.)
Poza tym, co tą linijką autor chciał osiągnąć?
komentarz 2 października 2018 przez Erfik878 Początkujący (310 p.)
Nie mogę uwierzyć, że zrobiłem taki głupi błąd. Po zmianie kodu i zapisywaniu NULL na ostatnim elemencie (wielkosc_tablicy - 1) wszystko już działa jak należy. Dzięki za pomoc.

Dalej mnie jednak zastanawia to dziwne zachowanie programu, a także to że przy debugowaniu nic nie wychodziło.
komentarz 2 października 2018 przez Poczprogramista123 Bywalec (2,900 p.)
Kompilator nie uzna tego za blad bo dla niego bledu nie ma. Pozatym co w tym dziwnego. Wyobraz sobie ze kupiles meble i chcesz je wstawic do mieszkania o numerze wielkosc_tablicy a tam takiego pokoju poprostu nie ma.
komentarz 2 października 2018 przez Poczprogramista123 Bywalec (2,900 p.)

@Secrus, Pocwiczyc dynamiczna alokacje pamieci?

komentarz 2 października 2018 przez Secrus Nałogowiec (32,880 p.)
Mam na myśli linijkę (wg listingu kodu, który wstawiłeś) nr 24. Po co przypisujesz tam tego NULLa?
komentarz 2 października 2018 przez Erfik878 Początkujący (310 p.)
jak nie przypiszę NULLa na koniec to na wyjściu oprócz ciągu znaków wychodzą też czasami śmieci z pamięci.

EDIT: dokładniej w elemencie wielkosc_tablicy -1
komentarz 2 października 2018 przez j23 Mędrzec (195,240 p.)

@Secrus,  c-stringi muszą kończyć się znakiem o kodzie 0. Jeśli tego nie zrobisz, przy wyświetlaniu lub innych operacjach na łańcuchu znakowym z dużym prawdopodobieństwem pojawią się błędy (z wyłożeniem aplikacji włącznie).

Podobne pytania

0 głosów
2 odpowiedzi 197 wizyt
pytanie zadane 28 marca 2016 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)
0 głosów
2 odpowiedzi 1,104 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez four Użytkownik (720 p.)
0 głosów
2 odpowiedzi 781 wizyt
pytanie zadane 4 października 2018 w C i C++ przez uther1455 Nowicjusz (140 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...