C - tablica dynamiczna

C - tablica dynamiczna
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Cześć, próbuje zrobić program, który wyszukuje liczby pierwsze w podanym przedziale sitem Eratostenesa. Zrobiłem to na normalnej tablicy, ale w zadaniu musi być użyta tablica dynamiczna. Spróbowałem tak to zrobić, działa, ale wyskakuje jakiś błąd, prawdopodobnie związany z pamięcią, ale nie wiem z czego wynika i nie umiem się tego dopatrzeć. Z góry dziękuję za pomoc ```c

Kopiuj
#include "pch.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>


int main()
{
	int a, b, limit, i, j;
	printf("Podaj przedzial\n");
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	int *tablica = (int*)malloc(b*sizeof(int));
	limit = floor(sqrt(b));
	//inicjuj tablice
	for (i = 1, j = a ; i <= b; i++, j++) tablica[i] = j;
	//algorytm - sito eratostenesa
	for (i = 2; i <= limit; i++)
	{
		if (tablica[i] != -1)
		{
			j = i + i;
			while (j <= b)
			{
				tablica[j] = -1;
				j += i;
			}
		}
	}
	//wypisz wynik
	printf("Liczby pierwsze z zakresu od %d do %d\n\n", a, b);
	for (i = a; i <= b; i++) if (tablica[i] != -1) printf("%d, ", i);
	free(tablica);
	return 0;
}
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1
Kopiuj
for (i = 1, j = a ; i <= b; i++, j++) tablica[i] = j;

Masz UB, tablice są indeksowane od zera.

daniel1302
  • Rejestracja: dni
  • Ostatnio: dni
0

A podasz nam ten blad? :) Wiekszosc pewnie nie ma jak tego skompilowac bo uzywasz gowno funkcji z M$

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

HEAP CORRUPTION DETECTED

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Jakie wpisujesz przedziały?

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
Kopiuj
#include "pch.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>


int main()
{
	int a, b, limit, i, j;
	printf("Podaj przedzial\n");
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	int *tablica = (int*)malloc(b*sizeof(int));
	limit = floor(sqrt(b));
	//inicjuj tablice
	for (i = 0, j = a ; i <= b; i++, j++) tablica[i] = j;
	//algorytm - sito eratostenesa
	for (i = 2; i <= limit; i++)
	{
		if (tablica[i] != -1)
		{
			j = i + i;
			while (j <= b)
			{
				tablica[j] = -1;
				j += i;
			}
		}
	}
	//wypisz wynik
	printf("Liczby pierwsze z zakresu od %d do %d\n\n", a, b);
	for (i = a; i <= b; i++) if (tablica[i] != -1) printf("%d, ", i);
	free(tablica);
	return 0;
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Nadal masz off-by-one: while (j <= b), i <= b;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.