2013-10-08 2 views
5

Я пишу код для сравнения двух входных файлов в стандартном C с использованием Xcode IDE. Я продолжаю получать эту ошибку: Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0). Я прочитал об этом и считаю, что это проблема с памятью, но независимо от того, что я пытаюсь, я не могу ее исправить (я также попытался сделать структуры динамически, используя malloc, и указал, что внизу код). Это странно, потому что он записывает все данные, а затем выплевывает эту ошибку в конце. Формат файла выглядит примерно так: start (int) .. stop (int) id (+ или -) теперь некоторые вещи, которые мне не нужны для остальной части строки Я только что тестировал это на файл с только + id, поэтому аспект «-» не является частью проблемы. В любом случае я довольно устал и смотрел на это несколько часов, поэтому, пожалуйста, простите меня, если это не имеет смысла, я обновлю его после нескольких часов сна.Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0) стандартная проблема с памятью C

typedef struct 
{ 
    int start; 
    int stop; 
    char *strandID; 
} location; 

int main(int argc, const char * argv[]) 
{ 
    if (argc != 4) 
    { 
    fprintf(stderr, 
     "Usage is ./a.out windowfile.txt genefile.txt outputFileName"); 
    exit(-1); 
    } 

    //const vars 
    const char *windowInput = argv[1]; 
    const char *geneInput = argv[2]; 
    const char *outputfile = argv[3]; 

    const int windowHeader = 9; 
    const int geneHeader = 3; 

    //get size of structures -- I have debugged and these work correctly, returning the size of my structure 
    const int posWsize = getSize(windowInput, "+", windowHeader); 
    const int negWsize = getSize(windowInput, "-", windowHeader); 
    const int posGsize = getSize(geneInput, "+", geneHeader); 
    const int negGsize = getSize(geneInput, "-", geneHeader); 

    //declare structs 
    location posWindow[posWsize]; 
    location negWindow[negWsize]; 
    location posGene[posGsize]; 
    location negGene[negGsize]; 

    //extract data here 
    getLocations(posWindow, negWindow, windowInput, windowHeader); 
    return 0; 
} 

void getLocations(location *posL, location *negL, const char *input, 
    const int header) 
{ 
    FILE *fileptr = NULL; 
    fileptr = fopen(input, "r"); //open file 

    if (fileptr == NULL) 
    { //check for errors while opening 
    fprintf(stderr, "Error reading %s\n", input); 
    exit(-1); 
    } 

    char tmpLoc[20]; 
    char tmpID[2]; 
    int eofVar = 0; 
    int lineCount = 0; 

    while (lineCount < header) 
    { //skip header and get to data 
    eofVar = fgetc(fileptr); 
    if (eofVar == '\n') 
     lineCount++; 
    } 

    int pCount = 0; 
    int nCount = 0; 

    while (eofVar != EOF) 
    { 
    fscanf(fileptr, "%s %s", tmpLoc, tmpID); //scan in first two strings 
    if (!strcmp(tmpID, "+")) 
    { //if + strand 
     char *locTok = NULL; 
     locTok = strtok(tmpLoc, ".."); //tok and get values 
     posL[pCount].start = atoi(locTok); 
     locTok = strtok(NULL, ".."); 
     posL[pCount].stop = atoi(locTok); //ERROR IS SHOWN HERE 

     posL[pCount].strandID = tmpID; 
     printf("start=%d\tstop=%d\tID=%s\tindex=%d\n", posL[pCount].start, 
      posL[pCount].stop, posL[pCount].strandID, pCount); 
     pCount++; 
    } 
    else if (!strcmp(tmpID, "-")) 
    { //if - strand 
     char *locTok = NULL; 
     locTok = strtok(tmpLoc, ".."); //tok and get values 
     negL[nCount].start = atoi(locTok); 
     locTok = strtok(NULL, ".."); 
     negL[nCount].stop = atoi(locTok); 

     negL[nCount].strandID = tmpID; 
     nCount++; 
    } 

    while ((eofVar = fgetc(fileptr)) != '\n') 
    { 
     if (eofVar == EOF) 
     break; 
    } 
    } 

    fclose(fileptr); 
} 

//dynamic way...same issue -- just replace this with the above if statement and use the create location function 
if (!strcmp(tmpID, "+")) 
{ //if + strand 
    int locStart; 
    int locStop; 

    locStart = atoi(strtok(tmpLoc, ".."));//tok and get values 
    locStop = atoi(strtok(NULL, "..")); 

    posL[pCount] = *createlocation(locStart, locStop, tmpID); 

    pCount++; 
} 

location *createlocation(int start, int stop, char *strandID) 
{ 
    location *tmp = NULL; 
    tmp = (location *) malloc(sizeof(location) * 1); 

    tmp->start = start; 
    tmp->stop = stop; 
    tmp->strandID = (char *) malloc(sizeof(char) * 2); 
    strcpy(tmp->strandID, strandID); 

    return tmp; 
} 
+0

Адресный код, который находится в '0x0', предлагает ссылку NULL-указателя. – tangrs

+0

Stacktrace или этого не произошло. Также программа не компилируется, поэтому я не могу получить свою собственную трассировку стека. – trojanfoe

+0

Вы запустили код через отладчик Xcode? – dreamlax

ответ

4

Проверьте возвращаемое значение strtok.

В коде здесь

locTok = strtok(NULL, ".."); 
posL[pCount].stop = atoi(locTok); //ERROR IS SHOWN HERE 

strtok возвращает указатель NULL и в соответствии с documentation,

A null pointer is returned if there are no tokens left to retrieve.

, который соответствует моей первоначальной догадку, что, так как адрес кода 0x0 есть указатель NULL почтительность где-то.

Очевидно, что следующий вызов atoi ожидает указатель не-NULL и сбой.

+0

В конце моего второго цикла while в getLocations поток идет только до символа новой строки. Таким образом, он будет сканировать во всех данных, добираться до eof, а затем проходить через цикл while еще раз. Это заставило scanf сканировать в EOF для первой строки и NULL для второго, вызывая ошибку во втором преобразовании atoi. Я исправил его, добавив 'eofVar = fgetc (fileptr); // проверить для eof if (eofVar == EOF) break; else eofVar = ungetc (eofVar, fileptr); ' после сканирования до конца строки. Если у вас есть более эффективный метод, дайте мне знать! Еще раз спасибо. –

0

Вы должны удалить аргументы основной функции. И это сработает.

Смежные вопросы