zbyt duża alokacja pamięci

0

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

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

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ść.

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 ;]

#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 ;]

0

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

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!

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