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

question-closed Błąd podczas inkrementowania wskaźnika

Object Storage Arubacloud
+1 głos
138 wizyt
pytanie zadane 14 lipca 2020 w C i C++ przez IgorK Nowicjusz (220 p.)
zamknięte 17 sierpnia 2020 przez IgorK

Kiedy próbowałem odtworzyć program z kursu https://www.youtube.com/watch?v=0DQl74alJzw&list=PLOYHgt8dIdoxx0Y5wzs7CFpmBzb40PaDo&index=11, program włącza się, ale wyskakuje błąd, który bym program tam nie robił to inny błąd, ale dotyczy tego samego elementu - wskaznik++;.

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;

int ile;
clock_t start, stop;
double czas;

int main()
{
	cout << "ile liczb w tablicy: ";
	cin >> ile;

	int* tablica;
	tablica = new int[ile];

	start = clock();

	for (int i = 0; i < ile; i++)
	{
		tablica[i] = i;
		tablica[i] += 50;
	}

	stop = clock();
	
	czas = (double)(stop - start)/CLOCKS_PER_SEC;
	cout << "czas zapisu (bez wskaznika): " << czas << endl;

	delete[]tablica;

	int* wskaznik = tablica;
	tablica = new int[ile];

	start = clock();
	for (int i = 0; i < ile; i++)
	{
		*wskaznik = i;
		*wskaznik += 50;
		wskaznik++;
	}

	delete[]tablica;

	_getch();
	return 0;
}

Dodam że programuje w visual studio.

komentarz zamknięcia: Problem rozwiązany
komentarz 14 lipca 2020 przez VBService Ekspert (253,420 p.)
Podaj treść błędu.

1 odpowiedź

+2 głosów
odpowiedź 14 lipca 2020 przez Oscar Nałogowiec (29,320 p.)
wybrane 14 lipca 2020 przez IgorK
 
Najlepsza
W linii 33 usuwasz "tablica", a linijkę dalej zapamiętujesz wartość tej zmiennej we "wskaznik" i potem używasz tego w drugiej pętli. Może się zdarzyć, że druga allokacja zajmie miejsce pierwszej, ale nie ma gwarancji.
1
komentarz 14 lipca 2020 przez Cook Nowicjusz (100 p.)
Jego sugestia jest jak najbardziej prawdziwa. OP zwolnił pamięć a następnie próbuje do niej uzyskać dostęp (UB). Dlatego program mu crashuje. Powinien zamienić linijki 35 i 36 miejscami (a najlepiej usunąć ten program bo nie ma sensu).
komentarz 14 lipca 2020 przez TOM_CPP Pasjonat (22,640 p.)

@VBService,
Nie każdy kod zamieszczony w internecie jest bezbłędny. Zobacz komentarze pod filmem.

komentarz 14 lipca 2020 przez IgorK Nowicjusz (220 p.)
Dobra, dzięki nie zauważyłem tego wcześniej
komentarz 14 lipca 2020 przez IgorK Nowicjusz (220 p.)

@Oscar, Tylko nie wiem dlaczego nie działa mi w takim razie ten program 

#include <iostream>
#include <conio.h>

using namespace std;

int ile;

int main()
{
	cout << "Ile liczb w tablicy: ";
	cin >> ile;

	int* tablica;
	tablica = new int[ile];

	for (int i = 0; i < ile; i++)
	{
		cout << (int)tablica << endl;
		tablica++;
	}

	delete[] tablica;

	_getch();
	return 0;
}

A jak dodam kolejny wskaźnik, na którym działam w pętli, to program działa bez błędu

#include <iostream>
#include <conio.h>

using namespace std;

int ile;

int main()
{
	cout << "Ile liczb w tablicy: ";
	cin >> ile;

	int* tablica;
	tablica = new int[ile];
	int* wskaznik = tablica;

	for (int i = 0; i < ile; i++)
	{
		cout << (int)wskaznik << endl;
		wskaznik++;
	}

	delete[] tablica;

	_getch();
	return 0;
}

 

1
komentarz 14 lipca 2020 przez Cook Nowicjusz (100 p.)
Operatorowi delete[] trzeba dostarczyć adres, który zwrócił new[]

Ty inkrementujesz wskaźnik w pętli a potem go dostarczasz delete[] przez co program próbuje zdealokować niepoprawny obszar pamięci co kończy się wysypaniem programu.
komentarz 14 lipca 2020 przez IgorK Nowicjusz (220 p.)
Dziękuje bardzo, chyba w końcu ogarnąłem o co chodzi

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 17 stycznia 2023 w C i C++ przez pixel1335 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 209 wizyt
0 głosów
0 odpowiedzi 119 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...