Zwalnianie pamięci - C - pomocy

witam forumowiczów serdecznie, mam następujący problem: napisałem funkcje do generowania macierzy z dynamicznie alokowaną pamięcią. następnie napisałem funkcję która pozwoli mi zwolnić przydzieloną wcześniej pamięć. program po uruchomieniu powoduje że komputer wydaje dźwięk błędu i program się zawiesza. jeśli to problem trywialny to wybaczcie.  

 

#include "stdafx.h"

#include "stdio.h"

#include "malloc.h"

#include "time.h"

#include "stdlib.h"



int** generowanie(int m, int n)

{

	srand(time(0));



	int **wsk = (int**)malloc(sizeof(wsk)*m);



	for (int i = 0; i <= m; i++)

	{

		wsk[i] = (int*)malloc(sizeof(wsk)*n);

	}



	for (int i = 0; i <= m-1; i++)

	{

		for (int j = 0; j <= n-1; j++)

		{

			wsk[i][j] = rand()%100;

		}

	}

    return wsk;

}



void zwalnianiePamieci(int **wsk, int n)

{

	for (int i = 0; i <= n; i++)

	{

		free(wsk[i]);

	}



	free(wsk);

}



int main()

{

	int m = 3;

	int n = 3;



	int **w = generowanie(m, n);



	zwalnianiePamieci(w, n);





	getchar();



	return 0;

}

 

Sama funkcja zwalnianiePamieci napisana jest prawie dobrze. Zastanów się, jak powinna wyglądać nierówność w warunku końcowym znajdującej się tam pętli, pamiętając że w C liczymy od 0. Oprócz tego funkcję tę wywołujesz potem dla złego parametru. Gdy m i n są równe, wszystko jest w porządku, ale to tylko jeden z wielu przypadków :wink:

Co się tyczy generowania macierzy, zacznijmy od tego, że jest to tablica tablic intów, a nie tajemniczego typu wsk. sizeof należy więc w odpowiednim miejscu wywołać dla int* i int. Tak jak w przypadku funkcji do zwalniania pamięci, zwróć uwagę na nierówności w pętlach, gdyż w tym miejscu tkwi sedno problemu. Ze swojej strony polecam trzymać się zapisu typu i < n, nie zaś i <= n - 1, bo jak widać na załączonym przykładzie, potem nagle dochodzimy do pomysłów w stylu i <= n (jeszcze raz przypominam, że indeksujemy od 0) :wink:

Na koniec, nie załączaj biblioteki malloc.h. Jest nie tylko niestandardowa, ale i zbyteczna, gdyż funkcje o których zapewne myślałeś, robiąc to (malloc i free) znajdują się w stdlib.h.

Pozdrawiam i trzymam kciuki :slight_smile: