Strona 1 z 1

C, naruszenie ochrony pamięci

: 30 października 2007, 23:15
autor: HipekBaa
Witam!

Jestem początkującym linuksowym programistą, dziś przeglądałem sobie skrypt z ćwiczeń z programowania i znalazłem tam kod dotyczący podawania argumentów i opcji do programu. O ile obsługa argumentów jest banalna, o tyle obsługa opcji (również banalna) przysporzyła mi problemów. Kod wygląda tak:

Kod: Zaznacz cały

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opcja;
int kod_powrotu=0;
char optstring[] = ":cvf:"; /* przetwarzane opcje */
while ( (opcja = getopt(argc,argv,optstring)) != -1 )
switch ( opcja ) {
case 'c' :
fprintf(stderr,"przetwarzam -c\n");
break;
case 'v' :
fprintf(stderr,"przetwarzam -v\n");
break;
case 'f' :
fprintf(stderr,"przetwarzam -f '%s'\n",optarg);
break;
case ':' : /* brakuje argumentu w opcji */
fprintf(stderr,"opcja -%c wymaga argumentu\n",optopt);
kod_powrotu = 1; /* Wystapil blad */
break;
case '?' :
default :
fprintf(stderr, "opcja -%c nie znana – ignoruje\n", optopt);
kod_powrotu = 1; /* Wystapil blad */
break;
}
printf("Pozostale argumenty:\n");
for ( ; optind < argc; ++optind )
printf("argv[%d] = '%s'\n",optind,argv[optind]);
return kod_powrotu;
}
I po tym (banalnym) fragmencie kodu (wklejonym wprost z materiałów wykładowcy) zamiast otrzymać wynik dostaję komunikat: "Naruszenie ochrony pamięci".

Próbowałem szukać czegoś na ten temat, jedyne czego się dowiedziałem to to, że ten błąd pojawia się przy próbie sięgnięcia do miejsca w pamięci, do którego nie mam uprawnień.

Ponieważ kod jest napisany poprawnie, przypuszczam, że problemem jest tu funkcja getopt.

Będę bardzo wdzięczny za pomoc...

Pozdrawiam

W.

: 30 października 2007, 23:32
autor: ponton
U mnie działa dobrze:

Kod: Zaznacz cały

tomek@laptop:~$ gcc -o test test.c -Wall -pedantic
tomek@laptop:~$ ./test 
Pozostale argumenty:
tomek@laptop:~$ ./test as
Pozostale argumenty:
argv[1] = 'as'
tomek@laptop:~$ ./test ass ddsf
Pozostale argumenty:
argv[1] = 'ass'
argv[2] = 'ddsf'
tomek@laptop:~$ ./test -ass ddsf
opcja -a nie znana – ignoruje
opcja -s nie znana – ignoruje
opcja -s nie znana – ignoruje
Pozostale argumenty:
argv[2] = 'ddsf'
tomek@laptop:~$ ./test -f       
opcja -f wymaga argumentu
Pozostale argumenty:
tomek@laptop:~$ ./test -f aa
przetwarzam -f 'aa'
Pozostale argumenty:
tomek@laptop:~$ 

: 04 listopada 2007, 22:42
autor: chyl-o
Taka moja uwaga, HipekBaa, dbaj troche bardziej o czytelność kodu :)