我在这里得到了分段错误

时间:2016-03-14 19:27:22

标签: c regex segmentation-fault

#include <stdio.h>
#include <unistd.h>
#include <regex.h>

#define MAX_LINE 80
int position = 0;
int main(void)
{
char *args[MAX_LINE/2+1];
char *tokens[MAX_LINE/2+1];
char *previoustokens[MAX_LINE/2+1];
char *history[10][MAX_LINE];
int should_run = 1;
char *split;
int i = 0;

while(should_run)
{

    tokens[0]=NULL;
    tokens[1]=NULL;

    char* command, param;
    int concurrent = 0;
    printf("osh>");
    fflush(stdout);
    fgets(args, sizeof(args),stdin);

    strtok(args,"\n");
    split = strtok(args," ");
    while(split!=NULL)
    {

        tokens[i]=strdup(split);
        split = strtok(NULL, " ");
        i++;

    }
    regex_t regex;
    int reti;
    char msgbuf[100];

    /* Compile regular expression */
    reti = regcomp(&regex, "^![[:digit:][:digit:]*]", 0);
    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }

    /* Execute regular expression */
    reti = regexec(&regex, args, 0, NULL, 0);
    if (!reti) {
        puts(tokens[0]);
        char *t = tokens[0];
        t++;
        int x;
        for(x=0;x<MAX_LINE/2+1;x++)
        {
            tokens[x]=history[(int)t-1][x];
        }
    }
    regfree(&regex);
}
}

所以这段代码应该做的是获取一个输入并将其拆分为令牌,然后检查是否与模式匹配,如果存在匹配模式,那么它应该从历史中复制一个条目并将其所有的所有物放入令牌,这是我得到分割错误的地方。

tokens[x] = history[(int)t-1][x];

我不确定为什么这不起作用。 非常感谢您的帮助。

由于

2 个答案:

答案 0 :(得分:1)

编译后阅读你的警告,他们是有原因的。所以,t是一个char *,你试图将char *(我的系统上的8字节)转换为int(我系统上的4个字节),你觉得这会怎么样?分段错误是由该行引起的,因为(int)t-1可能是非常大的东西(t是char *并且它存储了一个地址),所以你试图访问未分配的内存

答案 1 :(得分:-1)

感谢Alexie Dariciuc,我解决了我的问题 令牌[X] =历史[的atoi(T)-1] [X];

PS:从现在开始,我发出警告xD