2013-11-16 2 views
0

У меня есть назначение в классе «Операционные системы». Все в порядке с остальной частью моего кода, я скомпилирую его с помощью «gcc -o test test.c -Werror -Wall -pedantic -Wextra -Wfatal-errors », никаких ошибок или вообще ничего. Но когда я запускаю его, я получаю ошибку сегментации (ядро сбрасывается). Я положил некоторый printf на разных этапах программы, чтобы увидеть, в какой момент я получаю сообщение об ошибке (здесь возникает проблема). У меня нет вариантов на этом. Любая помощь приветствуется!Сбой сегментации (сбрасываемый сердечник)

Часть программы:

void inputToken(char *cmdInput) 
{ 
int i; 
int quit = 0; 
char *token; 
char *argList[] = {"\0", "\0", "\0", "\0", "\0", "\0", "\0"}; 
char *argv[] = {"&", "%"}; 

token = strtok(cmdInput, " "); 
i = 0; 

while(token != NULL && i<7) 
{ 
argList[i] = token; 
token = strtok(NULL, " "); 
i++; 
} 

for(i=7; i>0; i++) 
{ 
if(strcmp(argList[i], argv[0]) == 1) !!PROBLEM OCCURS HERE 
    { 
    <<SOME CODE>> 
     } 
} 
} 


/*READING USER COMMAND*/ 
void usrInput() 
{ 
int c; 
int i=0; 
char cmd[101]; 

while((c = getchar()) != EOF) 
{ 
if(c == '\n') 
    break; 
else if(i<100){ 
cmd[i]=c; 
i++; 
    } 
    } 

Спасибо заранее!

+3

Подумайте о 'для (I = 7; я> 0; я ++) снова'. –

+0

Скомпилируйте все предупреждения и отладочные данные 'gcc -Wall -g' и ** используйте отладчик **' gdb' !!! –

ответ

1

Массив в C 0 проиндексирован. argList[i] находится вне границ, если i является 7 и это то, что происходит на первой итерации:

for(i=7; i>0; i++) 
{ 
    if(strcmp(argList[i], argv[0]) == 1) !!PROBLEM OCCURS HERE 
    { 
    <<SOME CODE>> 
     } 
    } 
} 
+0

Конечно! Прямо перед моими глазами! Спасибо Ивайло Странджеву! – user2999242

1

Во-первых, в параметрах программ, ARGV [0] Ваше имя программы, поэтому он никогда не будет равна "\ 0":

./prog 12 lol -> argv[0] = "prog" | argv[1] = "12" | argv[2] = "lol" 

Затем, чтобы избежать ошибки seg, вы должны знать, что массив основан на 0. Таким образом, ваш массив списка аргументов имеет размер 7, от 0 до 6 (вара я должен быть уменьшенными):

for (i = 6; i >= 0; i--) 
    if(strcmp(argList[i], argv[0]) == 1) !! NO PROBLEM OCCURS HERE 
    { 
    <<SOME CODE>> 
    } 
    } 
} 
Смежные вопросы