核心转储在字符指针上

时间:2018-11-06 15:08:57

标签: c

我知道细分错误发生在哪里,但看不到原因。

我的主要功能是这样的:

int execute_line(char *line){
  char **arguments;

  int i = parse_args(arguments,line); //separates line in arguments

  printf("Number of tokens: %d \n",i); //prints number of total tokens

  printf("%s\n",arguments[0]); //print first token so I know it's not void

  int r = check_internal(arguments); //segmentation fault
}

parse_args函数填充以下参数:

int parse_args(char **args, char *line){

   const char s[]= " \t\n\r";
   char *token;
   token = strtok(line, s);//separates line with the separators
   int i=0;
   char null[] = "(null)";
   while( token != NULL ) {
      if (token[0]=='#'){ //if the like begins with "comment" I don't care

          args[i]=null;
          return i;
      }else{
          args[i] = token;// else fills each char * of **args with a token
          printf("Parse_args()--> token %d: ",i);
          printf("%s\n",token);
          i++;
    }
  token = strtok(NULL, s); //separates again
   }
   args[i]=null; //ends with null

return i;

}

我看不到为什么在parse_args正确返回令牌之后打印时会出现分段错误(所以**至少填充了参数),但是当我调用int r = check_internal(arguments)时,为什么?这给我带来了分段错误,(如果我在函数的第一行中没有显示打印内容,那么它就是断点(打印调试ftw))。

有人可以指出我缺少指向内存正确部分的指针的地方吗?

错误:分段错误(核心已转储)

check_internal:int check_internal(char ** args);

如果我输入的是:

hey ho letsgo

程序返回:

Parse_args()--> token 0: hey
Parse_args()--> token 1: ho
Parse_args()--> token 2: letsgo
Number of tokens: 3 
hey
Segmentation fault (core dumped)

谢谢能帮助我的人:D

1 个答案:

答案 0 :(得分:1)

调用parse_args时,arguments未初始化。然后在parse_args内部,当您分配给args[i]时,您将取消引用此未初始化的指针。这样做会调用undefined behavior,在这种情况下,这会显示为崩溃。

arguments声明为足够大的指针数组:

char *arguments[100];

或者,如果您不知道要拥有多少个参数,则可以传递char **的地址,并在读取参数时为其动态分配内存:

int parse_args(char ***args, char *line){

   const char s[]= " \t\n\r";
   char *token;
   token = strtok(line, s);//separates line with the separators
   int i=0;
   char null[] = "(null)";
   *args = malloc(1 * sizeof(char *));
   while( token != NULL ) {
      if (token[0]=='#'){ //if the like begins with "comment" I don't care

          (*args)[i]=null;
          return i;
      }else{
          (*args)[i] = token;// else fills each char * of **args with a token
          printf("Parse_args()--> token %d: ",i);
          printf("%s\n",token);
          i++;
      }
      *args = realloc(*args, i * sizeof(char *));
  token = strtok(NULL, s); //separates again
   }
   (*args)[i]=null; //ends with null

   return i;

} 

并这样称呼它:

char **arguments;

int i = parse_args(&arguments,line);