Naruszenie ochrony pamieci
Ostatnio zmodyfikowano 2016-11-10 19:43
oblac Temat założony przez niniejszego użytkownika |
Naruszenie ochrony pamieci » 2016-11-10 18:11:03 Program ma być własną implementacją polecenia ls. Problem pojawia się, gdy chcę podejrzeć inny katalog, niż bieżący. Wszystko się kompiluje, jednak przy uruchamianiu w terminalu wyskakuje błąd: "Naruszenie ochrony pamięci" (nawet gdy wpisuję jako nazwę katalogu katalog bieżący, np. "ls Pulpit" gdy program jest na Pulpicie). Zdaję sobie sprawę, że może być więcej błędów w kodzie, bo próbując naprawić ten główny już pomieszałam chyba wszystko. Zwiększenie rozmiaru tablicy nie pomogło. Przetrząsnęłam już google, próbowałam alokować tę tablicę charów dynamicznie. Nie wiem już, co tu może pomóc. Nie zwracam na razie uwagi na to -l i tak dalej, to jest drugorzędna sprawa na razie. #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <dirent.h> #include <string.h>
int main( int argc, char ** argv ) { char sciezka[ 512 ]; struct dirent * wpis; DIR * katalog; if( argc == 2 ) { if( strcmp( argv[ 1 ], "-l" ) == 0 ) { printf( "parametr -l" ); } else { katalog = opendir( sciezka ); while(( wpis = readdir( katalog ) ) != NULL ) { printf( "%s\n", wpis->d_name ); } } } else if( argc == 1 ) { katalog = opendir( "." ); while(( wpis = readdir( katalog ) ) != NULL ) { if((( strcmp( wpis->d_name, "." ) ) != 0 ) &&( strcmp( wpis->d_name, ".." ) != 0 ) ) { printf( "%s\n", wpis->d_name ); } } } closedir( katalog ); return 0; }
|
|
pekfos |
» 2016-11-10 18:49:10 katalog = opendir( sciezka );
|
Skąd twoim zdaniem bierze się tu ścieżka do pliku..? |
|
oblac Temat założony przez niniejszego użytkownika |
» 2016-11-10 18:59:26 Wytłumaczę o co chodziło. Jeżeli użytkownik wprowadzi parametr "-l" (na razie tak wprowadziłam), ma się coś tam robić. Jak nie, to jakikolwiek parametr ma być traktowany jak nazwa katalogu. Nie wiem chyba dobrze jak działa opendir (uświadomiłam to sobie odpowiadając na to pytanie). Ten kawałek to sztywny fragment kodu, na którym ma się opierać zadanie i miałam go skopiować. Gdzieś w notatkach mignął mi zapis opendir(sciezka), na chłopski rozum wstawiłam to.
Edit: zapoznałam się szerzej z opendirem. Próbowałam użyć strcpy, a potem po prostu zrobiłam opendir(argv[1]), ale błąd pozostał nadal. |
|
pekfos |
» 2016-11-10 19:16:15 Nie sprawdzasz, czy opendir() nie zwróciło zera. |
|
oblac Temat założony przez niniejszego użytkownika |
» 2016-11-10 19:26:30 Wciąż nie działa. int main( int argc, char ** argv ) { DIR * katalog; struct dirent * wpis; char sciezka[ 512 ]; strcpy( sciezka, argv[ 1 ] ); if(( katalog = opendir( argv[ 1 ] ) ) != NULL ) { while(( wpis = readdir( katalog ) ) != NULL ) { printf( "%s\n", wpis->d_name ); } } closedir( katalog ); return 0; }
|
|
pekfos |
» 2016-11-10 19:43:33 Jeśli zostanie zwrócone zero, nie masz po co wywoływać closedir(). Wywołanie z zerem może spowodować crash. nawet gdy wpisuję jako nazwę katalogu katalog bieżący, np. "ls Pulpit" gdy program jest na Pulpicie |
Katalog bieżący to kropka. Wpisanie "Pulpit" będzie szukać takiego katalogu w katalogu bieżącym, więc "Pulpit/Pulpit". |
|
« 1 » |