分段故障(核心转储)

时间:2013-11-16 12:58:00

标签: c linux segmentation-fault

我在“操作系统”课程中有一个作业。我的其余代码一切都很好,我用“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++;
     }
  }

提前谢谢!

2 个答案:

答案 0 :(得分: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>>
         }
  }
}

答案 1 :(得分:1)

首先,在程序参数中,argv [0]是你的程序名,所以它永远不会等于“\ 0”:

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

然后为避免seg错误,您必须知道数组是基于0的。所以你的argList数组的大小为7,从0到6(var i必须是decremented):

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