[C]Wycieki pamięci

0

Mam problem z wyciekiem pamięci w jednej funkcji. Nie jestem w stanie wyłapać tego błędu. Oto kod

char **teren()//funkcja pobiera z pliku tekstowego plansze i umieszcza ja w tablicy, która ma przydzielona pamieć ram
{
	char **plansza;
	char znak;
	int ROZ_X=20, ROZ_Y=20;
	int i,j;
	FILE*plik;
	plik=fopen("map.txt", "rt");
	if(plik==NULL)
	{
		return NULL;
	}
	plansza=(char**)malloc(sizeof(char*));//przydzielamy pamięć tabeli na adresy

	for(i=0;i<20;i++)
	{
		plansza[i]=(char*)malloc(sizeof(char));//przydzielamy wierszom pamięć
	}

	for(i=0;i<ROZ_X;i++)//umieszczamu mapę w tablicy :)
	{
		for(j=0;j<ROZ_Y;j++)
		{
			fscanf(plik,"%c", &znak);
			plansza[i][j]=znak;
		}
	}
		
	fclose(plik);
	return plansza;
}

Z góry dziękuje za pomoc.

0

Jest malloc, musi być free. Gdzie? To już Ty wiesz lepiej, tam gdzie kończy się użycie zmiennej zwracanej przez tę funkcję.

0

?

malloc(sizeof(char*));//przydzielamy pamięć tabeli na adresy

ja tu widze przydzielenie pamięci na JEDEN wskaźnik, a ty potem iterujesz to aż do 20. Rozumiem że twój kompilator czyta w myślach i wie że chodzi ci akurat o 20 elementów w tablicy?

0

Niestety to dalej nie to.
Ze zwolnieniem pamięci na tablice to spokojnie. Nie jest to konieczne na tym etapie. Chwilowo to ma się skompilować i wyświetlić zawartość pliku. Zapodam może większą część kodu. Ponieważ tamto nie pomogło

#include<stdio.h>
#include<stdlib.h>
#include"libra.h"

char **teren();
int findhero();
int main()
{
	Plecak=(struct Backpack*)malloc(sizeof(struct Backpack));
	Plecak->klucz1=0;
	Plecak->klucz2=0;
	Plecak->cash=0;
	Gdzie=(struct Kordy*)malloc(sizeof(struct Kordy));
	char **plansza=teren();
	findhero(&plansza);
	ruch(&plansza);	

	free(Plecak);
	free(Gdzie);
	return 0;
}

char **teren()//funkcja pobiera z pliku tekstowego plansze i umieszcza ja w tablicy, która ma przydzielona pamieć ram
{
	char **plansza;
	char znak;
	int ROZ_X=20, ROZ_Y=20;
	int i,j;
	FILE*plik;
	plik=fopen("map.txt", "rt");
	if(plik==NULL)
	{
		return NULL;
	}
	plansza=(char**)malloc(sizeof(char*)*20);//przydzielamy pamięć tabeli na adresy

	for(i=0;i<20;i++)
	{
		plansza[i]=(char*)malloc(sizeof(char)*20);//przydzielamy wierszom pamięć
	}

	for(i=0;i<ROZ_X;i++)//umieszczamu mapę w tablicy :)
	{
		for(j=0;j<ROZ_Y;j++)
		{
			fscanf(plik,"%c", &znak);
			plansza[i][j]=znak;
		}
	}
		
	fclose(plik);
	return plansza;
}

int findhero(char **hero)
{
	int a,b;
	for(a=0;a<20;a++)
	{
		for(b=0;b<20;b++)
		{
			if(hero[a][b]=='0')
			{
				Gdzie->WYS=a;
				Gdzie->SZER=b;
			}
		}
	}
	return 0;
} 
0

Ale co to w ogóle jest? Jaki błąd? Co to za zmienne globalne? o_O
Czemu jak ktoś nie umie jakiegoś języka to zaczyna od pisania w nim gry, a nie jakiejś prostej aplikacji na 20 linijek?
Możesz łaskawie napisać jaki właściwie masz problem? Co tu nie działa?

0

To nie tak, że totalnie nie znam C. W zasadzie pisze projekt na uczelnie i nie nie wywala błędu. Wręcz przeciwnie kompiluje mi się cały kod bezbłędnie a nawet bez warningów. Natomiast przy odpaleniu dostaje "Naruszenie pamięci" a więc gdzieś mam wyciek pamięci i nie mogę go znaleźć.

Co do zmiennych globalnych oto zawartość mojej biblioteki

struct Backpack
{
	int klucz1;
	int klucz2;
	int cash;
};

struct Kordy
{
	int SZER;
	int WYS;
};

struct Backpack *Plecak;
struct Kordy *Gdzie;
0

Tu jest blad, wskaznik na wskaznik, a wskaznik na wskaznik wskazujacy na wskaznik to co innego.

findhero(&plansza);

@down: chyba wlasnie zrobiles, wystarczylo napisac:

findhero(plansza);
0

Fakt, większej głupoty już zrobić nie mogłem. Jednak coś dalej jest nie tak. Oto kod

#include<stdio.h>
#include<stdlib.h>
#include"libra.h"

char **teren();
int findhero(char***);
int main()
{
	Plecak=(struct Backpack*)malloc(sizeof(struct Backpack));
	Plecak->klucz1=0;
	Plecak->klucz2=0;
	Plecak->cash=0;
	Gdzie=(struct Kordy*)malloc(sizeof(struct Kordy));
	char **plansza=teren();
	findhero(&plansza);
	ruch(&plansza);	

	free(Plecak);
	free(Gdzie);
	for(i=0;i<20;i++)
	{
		free(plansza[i]);
	}
	free(plansza);
	return 0;
}

char **teren()//funkcja pobiera z pliku tekstowego plansze i umieszcza ja w tablicy, która ma przydzielona pamieć ram
{
	char **plansza;
	char znak;
	int ROZ_X=20, ROZ_Y=20;
	int i,j;
	FILE*plik;
	plik=fopen("map.txt", "rt");
	if(plik==NULL)
	{
		return NULL;
	}
	plansza=(char**)malloc(sizeof(char*)*20);//przydzielamy pamięć tabeli na adresy

	for(i=0;i<20;i++)
	{
		plansza[i]=(char*)malloc(sizeof(char)*20);//przydzielamy wierszom pamięć
	}

	for(i=0;i<ROZ_X;i++)//umieszczamu mapę w tablicy :)
	{
		for(j=0;j<ROZ_Y;j++)
		{
			fscanf(plik,"%c", &znak);
			plansza[i][j]=znak;
		}
	}
		
	fclose(plik);
	return plansza;
}

int findhero(char ***hero)
{
	int a,b;
	
	for(a=0;a<20;a++)
	{
		for(b=0;b<20;b++)
		{
			if(*hero[a][b]=='0')
			{
				Gdzie->WYS=a;
				Gdzie->SZER=b;
			}
		}
	}
	return 0;
}

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