Wskaźniki w rekurencji i krzaczki

0

Witam.
Natrafiłem dziś na dość irytujący błąd. Mam rekurencyjną funkcję, która zwraca char*. Póki wywoła się raz - jest okej, zwraca tekst. Gdy wywoła sama siebie zwraca "krzaczki". Wygląda ona mniej więcej tak:

char* max_size(char *path, int *max)
{	
	char filename[255] = "";
	char *max_name;

	max_name = (char *) malloc (255 * sizeof(char));

	//...

	while ((dit = readdir(dip)) != NULL)
	{
		// Omijamy . i ..
		if (strcmp(dit->d_name, ".") != 0 
		&& strcmp(dit->d_name, "..") != 0)
		{
			strcpy(filename, path);
			strcat(filename, dit->d_name);
			
			if (is_dir(filename))
			{
				strcat(filename, "/");
				max_name = max_size(filename, max);
			}
			else
			{
				stat(filename, &st);
			
				if (st.st_size > *max)
				{
					strcpy(max_name, filename);
					*max = st.st_size;
				}
			}
		}
	}
	
	return max_name;
}

Wywołanie:

int max = 0;
char* name;

name = max_size(path, &max);

Głupieję w obliczu wskaźników i referencji, więc prosiłbym o jakąś wskazówkę co z tym fantem zrobić. Z góry dziękuję :)

0
  1. po co is_dir a potem jeszcze stat(), skoro stat zalatwi ci wszystko.
  2. po co rekurencyjnie alokujesz skoro nie musisz ?
  3. na sciezke do pliku lepiej sobie zostawic troche wiecej miejsca, tak kolo PATH_MAX :)
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>


void max_size(char *path,int *max,char* max_name){
  char filename[PATH_MAX]="";
  DIR* dip=opendir(path);
  if(!dip)return;
  struct dirent* dit;
  while((dit=readdir(dip))){   // jesli sie boisz o parenthezis wystarczy przypisanie w dodatkowym nawiasie
    if(strcmp(dit->d_name,".") && strcmp(dit->d_name,"..")){
      strcpy(filename,path);
      strcat(filename,"/");
      strcat(filename,dit->d_name);
      struct stat st;
      if(!stat(filename,&st)){
        if(S_ISDIR(st.st_mode)){
          max_size(filename,max,max_name);
        }else{
          if(st.st_size>*max){
            strcpy(max_name,filename);
            *max=st.st_size;
          }
        }
      }
    }
  }
  closedir(dip);
}

int main(int argc,char** argv){
  char* path=".";
  if(argc>1)path=argv[1];
  int max=0;
  char name[PATH_MAX];
  max_size(path,&max,name);
  printf("%s %d\n",name,max);
  return 0;
}

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