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
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)
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.