Problem z reallock()

0

Mam talbicę
char tab[1][100];
W jaki sposob moge zaalokowac pamięc dla tab[2] ??
Przykład który nie działa :

int count=1;
char tab[1][PATH_MAX];

	while((entry = readdir(dir))!= NULL)
	{
		if(i==count)
		{
			char* tab=realloc(tab, sizeof(tab)+sizeof(tab[0]));
			if(tab==NULL)
				abort();
			count++;
			fprintf(stderr, "reallocuje :)\r\n");
		}
		

		stat(entry->d_name, &stats);
		if(strcmp(entry->d_name, ".")==0) continue;
		
		if(S_ISDIR(stats.st_mode))
			sprintf(tab[i], "/%s", entry->d_name, getdate(stats.st_mtime));
		else
			sprintf(tab[i], " %s", entry->d_name, getdate(stats.st_mtime));

		fprintf(stderr, "%s %d %d\r\n", tab[i], i, count);
		i++;		
	}

Program powinien wrzucic do tab[] wszystkie foldery i pliki z danego katalogu, ale nie wiem czemu zatrzymuje sie zawsze przy 11 elemencie:

pucik@slack:~/src/cc$ ./test
/..
/lost+found
/var
/mnt
/dev
/bin
/etc
/lib
/tmp
/usr
/boot
Segmentation fault

Moze ktos wie w czym problem ??

0

char tab[1][PATH_MAX];

to tablica [jedenelement][PATH_MAXelementów]. Czyli maksymalne indeksowanie: tab[0][PATH_MAX-1], trochę bez sensu, bo mozna ja zadeklarować troche prosciej: char tab[PATH_MAX]

A spróbuj char** tab, wtedy nie okreslasz maksymalnych rozmiarów. A i sama realokacje popraw:

// aby dodać wskaznik do nowej 'linijki':
tab=realloc(tab,countsizeof(void))
// albo char**, albo inny, dowolny wskaźnik.
// do zwolnienia, free(tab) lub realloc(tab,0)

// aby przydzielic pamiec 'linijce':
tab[count-1]=(char*)malloc(PATH_MAX); //(char*)realloc(NULL,PATH_MAX);
// do zwolnienia free(tab[count-1]), realloc(tab[count-1],0);
// LUB:
tab[count-1]=new char[PATH_MAX];
// do zwolnienia delete tab[count-1]

Nie wiem, czy pod linuchem new jest tym samym, co malloc,
pod dosem nie jest, a pod łinzgrozą owszem.

// count -1, popełniłem ten sam błąd, co ty. ;-)

0

Piwo dla ciebie :) działa :D

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