Ошибка Getopt: нарушение защиты памяти - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь использовать getopt, но у меня проблема.После запуска ./a.out -A -R я вижу memory protection violation.Что я делаю не так?

int c;
int rec_flag=0;
int copy_range=0;
while((c=getopt(argc,argv,"AR:"))!=-1){
    switch(c){
        case 'A':
            copy_range=1;
            break;
        case 'R':
            rec_flag=1;
            break;
        case '?':
            if (optopt == 'c')
                fprintf (stderr, "Option -%c requires an argument.\n", optopt);
            else if (isprint (optopt))
                fprintf (stderr, "Unknown option `-%c'.\n", optopt);
            else
                fprintf (stderr,"Unknown option character `\\x%x'.\n",optopt);
            return 1;
        default:
            abort ();
    }
}

1 Ответ

0 голосов
/ 09 апреля 2019
while((c=getopt(argc,argv,"AR:"))!=-1){
 switch(c){
    ...
    case '?':  if (optopt == 'c')
                   fprintf (stderr, "Option -%c requires an argument.\n", optopt);

getopt никогда не установит optopt в 'c' в вашей программе.

В примере кода, из которого вы его вставили, строка формата была "abc:".Поэтому optopt будет 'c', если -c был передан без аргумента (что, как отмечено выше, двоеточие в строке формата означает, что это требуется).Ваша программа вообще не имеет опции -c.Вы не удалили спецификацию третьего варианта, потому что ваша программа принимает 2 аргумента ... верно?

Убедитесь, что вы #included <unistd.h> и <ctype.h>, как это сказано, затем попробуйте объявить переменные getopt как extern.Memory protection violation может означать, что компоновщик в настоящее время извлекает их как транзитивные включения, но ядро ​​не ожидает, что ваш процесс получит доступ к области общей памяти, в которую отображается часть libc.Просто предположение, но это действительно помогло устранить некоторые ошибки, с которыми я столкнулся при попытке запустить ваш код.

https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt https://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getopt

...