zbyt duża alokacja pamięci

zbyt duża alokacja pamięci
R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

tworzę strukturę w której mogę przechowywać macierz o wymiarze jaki podam jako parametr.

kod, który tworzy macierz i alokuje pamięć:

Kopiuj
plansza * make_board(int dimension)
{
	int i;
	plansza *tablica = (plansza*) malloc(sizeof(plansza));
	if(tablica!=NULL)
	{
		tablica->size=dimension;
		tablica->dane = (int**) malloc(sizeof(int*) * dimension);
		for(i=0;i<dimension;i++)
			tablica->dane[i]=(int*) malloc(sizeof(int)*dimension);
	}
	return tablica;
}

z kodu wynika, że powinna utworzyć się macierz kwadratowa.
jednak jeśli wejdę w debuger i zacznę czytać wartości kolejnych komórek macierzy napotykam na dziwną rzecz. http://images.tinypic.pl/i/00763/7rh79j13zbbh_t.jpg

"pionowe" komórki macierzy po przekroczeniu obszaru alokacji pamięci nie są dostępne, natomiast komórki macierzy "poziome" ciągną się w nieskończoność.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Nic sie nie ciągnie w nieskończoność. C/C++ nie sprawdza po prostu zakresów tablic. Póki nie spróbujesz czytać za daleko albo nie nadpiszesz czegoś ważnego w pamięci to możesz nie zauważyć że coś jest nie tak ;]

Kopiuj
#include <stdio.h>

int main() {
	int x = 0;
	int y = 0;
	int z = 0;
	int tab[1]={0};
	tab[1] = 2;
	tab[2] = 3;
	tab[3] = 4;
	printf("%d %d %d", z, y, x);
	return 0;
}

skompiluj sobie i odpal (koniecznie bez optymalizacji więc gcc -O0) ten kod i zobacz co wypisuje ;]

R1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

czyli wszystko jest dobrze zadeklarowane i nie tracę pamięci na darmo ?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Nie.

dlaczego można zapisywać dane na miejsca tablicy, które nie istnieją?

Jak wspomniał @Endrju wg standardu to jest niezdefiniowane zachowanie. Ale odnosząc się do konkretnej implementacji z której korzystałem, przy wyłączonej optymalizacji następuje tutaj zwykłe pisanie zgodnie z arytmetyką wskaźników. tablica[i] to nic innego jak odwołanie się do pamięci pod adresem tablica+i. W przykładzie który podalem wyżej "za" tablicą leżą moje 3 zmienne (bo stos rośnie w górę!) więc pisanie do pamięci poza tablicą po prostu nadpisuje te moje zmienne bo one leżą tam w pamięci.

Popatrz dokładnie na ten kod, nie ma tam żadnego rozmnożenia pamięci. Po prostu nadpisałem wartości w zmiennych x,y,z!

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.