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

Naruszenie dostępu do zapisu w C

Aruba Cloud - Virtual Private Server VPS
0 głosów
386 wizyt
pytanie zadane 6 czerwca 2022 w C i C++ przez kacper1445 Mądrala (5,050 p.)
edycja 6 czerwca 2022 przez kacper1445

Hej mam prostą alokację pamięci

int* result_tab = malloc((end + 1) * sizeof(int));
result_tab[0] = 1;

Gdzie zmienna end jest zwykłym intem. Kompilator wyrzuca mi wyjątek "Naruszenie dostępu do zapisu". Ktoś wie o co tutaj chodzi? Dodam tylko że korzystam z kompilatora z Visual Studio.

Cały kod

#include <stdio.h>

void swap(int* tab, int index1, int index2) {
	int tmp = tab[index1];
	tab[index1] = tab[index2];
	tab[index2] = tmp;
}


// Easy sort alghoritms

void dumb_sort(int* tab_to_sort, int size) {
	int index = 0;

	do {
		if (tab_to_sort[index] > tab_to_sort[index + 1]) {
			swap(tab_to_sort, index, index + 1);
			index = 0;
			continue;
		}
		index++;
	} while (index < size - 1);
}

void bubble_sort(int* tab_to_sort, int size) {
	int index1, index2;

	for (index1 = 0; index1 < size - 1; index1++)
		for (index2 = 0; index2 < size - 1; index2++)
			if (tab_to_sort[index2] > tab_to_sort[index2 + 1]) 
				swap(tab_to_sort, index2, index2 + 1);
}

void insertion_sort(int* tab_to_sort, int size) {
	int index1, index2, tmp;

	for (index1 = size - 2; index1 >= 0; index1--)
	{
		tmp = tab_to_sort[index1];
		index2 = index1 + 1;
		while ((index2 < size) && (tmp > tab_to_sort[index2]))
		{
			tab_to_sort[index2 - 1] = tab_to_sort[index2];
			index2++;
		}
		tab_to_sort[index2 - 1] = tmp;
	}
}


// Speed sort alghoritms

void quick_sort(int* tab_to_sort, int start, int end) {
	int index1, index2, pivot;

	index1 = (start + end) / 2;
	pivot = tab_to_sort[index1];

	tab_to_sort[index1] = tab_to_sort[end];
	for (index2 = index1 = start; index1 < end; index1++)
		if (tab_to_sort[index1] < pivot)
		{
			swap(tab_to_sort, index1, index2);
			index2++;
		}
	tab_to_sort[end] = tab_to_sort[index2]; 
	tab_to_sort[index2] = pivot;

	if (start < index2 - 1)  
		quick_sort(tab_to_sort, start, index2 - 1);
	else if (index2 + 1 < end) 
		quick_sort(tab_to_sort, index2 + 1, end);
}

int* merge_sort(int* tab_to_sort, int start, int end) {
	int mid, index1, index2, index;
	int* result_tab = (int*)malloc((end + 1) * sizeof(int));
	result_tab[0] = 1;
	mid = (start + end + 1) / 2;

	if (mid - start > 1) 
		merge_sort(tab_to_sort, start, mid - 1);
	if (end - mid > 0) 
		merge_sort(tab_to_sort, mid, end);
	
	index1 = start; 
	index2 = mid;
	for (index = start; index <= end; index++)
		result_tab[index] = ((index1 == mid) || ((index2 <= end) && (tab_to_sort[index1] > tab_to_sort[index2]))) ? tab_to_sort[index2++] : tab_to_sort[index1++];

	return result_tab;
}


int main()
{
	int tab[6] = { 2, 5, 10, 1, 0, 11 };
	merge_sort(tab, 0, 5);

	for (int i = 0; i < 6; i++) {
		printf("%d ", tab[i]);
	}
}

Błąd występuje w funkcji merge_sort()

komentarz 6 czerwca 2022 przez Oscar Nałogowiec (29,340 p.)
Chwila. Kompilator czy skompilowany program?
komentarz 6 czerwca 2022 przez kacper1445 Mądrala (5,050 p.)
Podczas kompilacji, wyskakuje mi ten błąd więc kompilator
komentarz 6 czerwca 2022 przez Oscar Nałogowiec (29,340 p.)
Dodaj rzutowanie na int * wyniku malloca.

Ewentualnie to coś z plikami - kompilator nie może zapisać wyniku bo plik jest read only, ma innego właściciela albo jest w użyciu?
komentarz 6 czerwca 2022 przez kacper1445 Mądrala (5,050 p.)
Próbowałem również z rzutowaniem. Nie operuję tutaj na plikach więc to nie jest tego kwestia niestety.
komentarz 6 czerwca 2022 przez adrian17 Mentor (352,580 p.)
Nie no, ewidentnie to jest błąd w uruchamianym programie, a nie kompilatorze.

Możesz pokazać więcej kodu, najlepiej całość?
komentarz 6 czerwca 2022 przez kacper1445 Mądrala (5,050 p.)
Dodałem cały kod w pytaniu już

1 odpowiedź

0 głosów
odpowiedź 6 czerwca 2022 przez kacper1445 Mądrala (5,050 p.)
Zadziałało dodanie biblioteki stdlib.h

Podobne pytania

0 głosów
1 odpowiedź 1,467 wizyt
pytanie zadane 19 listopada 2019 w C i C++ przez bakobydlak Nowicjusz (160 p.)
0 głosów
1 odpowiedź 1,444 wizyt
pytanie zadane 10 czerwca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

93,326 zapytań

142,323 odpowiedzi

322,391 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...