Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Naruszenie ochrony pamieci

Ostatnio zmodyfikowano 2016-11-10 19:43
Autor Wiadomość
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.


C/C++
#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;
}
P-153542
pekfos
» 2016-11-10 18:49:10
C/C++
katalog = opendir( sciezka );
Skąd twoim zdaniem bierze się tu ścieżka do pliku..?
P-153544
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.
P-153545
pekfos
» 2016-11-10 19:16:15
Nie sprawdzasz, czy opendir() nie zwróciło zera.
P-153547
oblac
Temat założony przez niniejszego użytkownika
» 2016-11-10 19:26:30
Wciąż nie działa.

C/C++
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;
}
P-153548
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".
P-153549
« 1 »
  Strona 1 z 1