我知道细分错误发生在哪里,但看不到原因。
我的主要功能是这样的:
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
答案 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);