Dynamiczne alokowanie pamieci, program przestaje dzialac

0

Witam,

Mam do napisania program, który wczytuje liczby do dynamicznej tablicy a potem przeszukuje je w celu znalezienia odpowiednich elementów. Program się kompiluje i zwraca prawidłowe dane, ale w końcowej jego fazie najzwyczajniej w świecie się wiesza. Błąd typu "program przestał działać".

Zamieszczam kod i proszę o pomoc.


int main()
{
	int ile; //zmienna przechowująca liczbe liczb do wczytania
	int* tab; //
	int i = 0;
	int min; //zmienna przechowująca najmniejszą wczytaną liczbę
	int nrMin = 0; //zmienna przechowująca "indeks" najmniejszej liczby
	int max; //zmienna przechowująca największą wczytaną liczbę
	int nrMax = 0; //zmienna przechowująca "indeks" największej liczby
	int suma = 0; //zmienna przechowująca sumę wczytanych liczb
	float srednia = 0;  //zmienna przechowujaca srednia arytmetyczna wczytanych liczb
	
	scanf( "%d", &ile );
	tab = (int *) calloc ( ile, sizeof ( int ) );
	
	//printf ( "adres tab: %d\n", tab );
	//printf ( "sizeof ( int ) = %d", sizeof ( int ) );
	
	while ( i < ile )
	{	
		scanf ( "%d", ( tab + sizeof ( int ) * i ) );
		i++;
	}	
	
	min = *tab;
	max = *tab;
	i = 0;	
	while ( i < ile )
	{
		//printf ( "sprawdzanie miejsce w pamieci: %d, wartosc: %d\n", ( tab + sizeof ( int ) * i ), *( tab + sizeof ( int ) * i ) );
		suma = suma + *( tab + sizeof ( int ) * i );
		if ( *( tab + sizeof ( int ) * i ) > max )
		{
			max = *( tab + sizeof ( int ) * i );
			nrMax = i;
		}	
		else
			if ( *( tab + sizeof ( int ) * i ) < min )
			{
				min = *( tab + sizeof ( int ) * i );
				nrMin = i;
			}		 	
		i++;
	}	
	
	srednia = suma * 1.0 / ( i - 1 );
	
	printf ( "min: tab [ %d ] = %d\n", nrMin, min );
	printf ( "max: tab [ %d ] = %d\n", nrMax, max );
	printf ( "suma = %d, srednia = %f\n", suma, srednia );	
	
	free ( tab );
	tab = NULL;
		
	system ( "pause" );	
}
 

Z góry dzięki za każdą pomoc!

0

Wywal te wszystkie sizeofy oprócz pierwszego. Tam faktycznie masz podać ilość bajtów, ale w reszcie przypadków kompilator sam obliczy jaka jest wielkość elementu tablicy, nie musisz mu pomagać.

0
Rev napisał(a)

Wywal te wszystkie sizeofy oprócz pierwszego. Tam faktycznie masz podać ilość bajtów, ale w reszcie przypadków kompilator sam obliczy jaka jest wielkość elementu tablicy, nie musisz mu pomagać.

Ok, wszystko już bangla ;) Wielkie dzięki za pomoc. Czyli mam rozumieć, że przy przesuwaniu wskaźnika nie przesuwamy o liczbe bajtów, a o liczbe komorek w pamieci?

1 użytkowników online, w tym zalogowanych: 0, gości: 1