Alokowanie pamięci w funkcji w C

0

Ćwiczę alokację pamięci i przyszła pora żeby zwolnić pamięć w funkcji:

int main()
{int i;
	int m,n;
	int *p;

	srand(time(NULL));
	printf("Ile wierszy: ");
	scanf("%d",&n);
	printf("Ile kolumn: ");
	scanf("%d", &m);
	
	p=tablica(n,m);
	wypisz(p,n,m);
	zwolnij(p,n,m);

	system("PAUSE");
	return 0;
}



int * tablica(int n, int m)
{
	int i,j;

	int *k=(int*)malloc(sizeof(int)*n);
	if(k==NULL)
		return NULL;

	for(i=0; i<n; i++)
	{
		k[i]=(int*)malloc(sizeof(int)*m);
		if(k[i]==NULL)
			return NULL;
	}

	for(i=0; i<n; i++)
		for(j=0; j<m; j++)
			*(k+(i*m+j)*sizeof(int))=rand()%100;

	return k;
}

void wypisz (int *k,int n,int m)
{
	int i,j;

	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
			printf("%d\t", *(k+(i*m+j)*sizeof(int)));
		printf("\n");
	}
}


void zwolnij(int *p, int n, int m)
{
	int i,j;
	
	for(i=0; i<n; i++)
		free(p+m*i*sizeof(int));    //<- zakładam, że to tu się dzieje jakaś katastrofa
	free(p);
	p=NULL;

}

Program się wykonuje, losuje i wypisuje tablicę, ale potem wyskakuje błąd:

Windows has triggered a breakpoint in Alokacja.exe.

This may be due to a corruption of the heap, which indicates a bug in Alokacja.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Alokacja.exe has focus.

The output window may have more diagnostic information

Przeszukałem trochę internetu, próbowałem na bazie innych kodów to poprawić, używałem tablicy (p[i]) do zwalniania pamięci, ale nic nie działa

0

Problem jest, że chyba nie rozumiesz wskaźników... Masz wskaźnik, alokujesz pamięć , a następnie przypisujesz wartości kolejnych alokacji do elementów tablicy. Wyniki te nadpisujesz później wartościami przypadkowymi.... Jak zrozumiesz co jest nie tak, to będziesz więdział co poprawić, podpowiedź, p powinno być int **p;

0

Jest wielce prawdopodobne, że nie rozumiem wskaźników, ale jakoś się ich muszę nauczyć. Walczyłem dalej stosując się do podpowiedzi, ale nadal nie jest dobrze:

int main()
{
	
	int i;
	int m,n;
	int **p=NULL;

	srand(time(NULL));
	printf("Ile wierszy: ");
	scanf("%d",&n);
	printf("Ile kolumn: ");
	scanf("%d", &m);
	
	p=tablica(n,m);
	wypisz(*p,n,m);
	zwolnij(*p,n,m);

	system("PAUSE");
	return 0;
}



int * tablica(int n, int m)
{
	int i,j;

	int **k=(int**)malloc(sizeof(int)*n);
	if(k==NULL)
		return NULL;

	for(i=0; i<n; i++)
	{
		k[i]=(int*)malloc(sizeof(int)*m);
		if(k[i]==NULL)
			return NULL;
	}

	for(i=0; i<n; i++)
		for(j=0; j<m; j++)
			k[i][j]=rand()%100;
	return *k;
}

void wypisz (int *k,int n,int m)
{
	int i,j;

	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
			printf("%d\t", k[i*m+j]);      //<- w tym miejscu pojaiwa się błąd
		printf("\n");
	}
}


void zwolnij(int *p, int n, int m)
{
	int i,j;
	
	for(i=0; i<n; i++)
		free(p+m*i*sizeof(int));
	free(p);
	p=NULL;

}

Kompiluje się, pobiera ilość kolumn i wierszy, ale przy wypisywaniu pojawia się błąd: Access violation reading location z odpowiednim adresem do pamięci, którą sobie akurat zaalokował. Próbowałem jakoś zmienić to wypisywanie, ale w związku z tym, że mam w/w braki to nie potrafię tego zrobić

0

Bo powinienes zastosowac podpowiedz dalej i zwracac k w funkcji tablica, ktora powinna zwracać int ** powinno byc tam więcej analogii... Ćwicz dalej.

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