2016-12-30 19 views
-1

Вот мой хвост код (для первых 10 строк):Неожиданное нарушение Асесс чтение (хвост)

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

typedef char storage_datatype; 

#define MAXLINESIZE 1000 
#define STORAGESIZE 10000 
#define MAXLINES 100 

int mgetline(char*, int); 
char* alloc(int n); 
void cp(char*, char*); 

char *lines[MAXLINES]; 

storage_datatype storage[STORAGESIZE]; 
storage_datatype *storagep = storage; 

int main(int argc, char **argv) { 
    int space, i; 
    space = i = 0; 
    char line[MAXLINESIZE]; 
    char* p; 
    while ((space = mgetline(line, MAXLINESIZE)) > 0) { 
     p = alloc(space); 
     cp(p, line); 
     lines[i++] = p; 
    } 
    i = 0; 
    while (i < 10) { 
     if (*lines[i]) { 
      printf("%s", lines[i++]); 
     } 
    } 
    getchar(); 
    return 0; 
} 

int mgetline(char *s, int lim) 
{ 
    int c; 
    char *t = s; 

    while (--lim > 0 && (c = getchar()) != EOF && c != '\n') 
     *s++ = c; 
    if (c == '\n') 
     *s++ = c; 

    *s = '\0'; 

    return s - t; 
} 

char* alloc(int n) { 
    if (storage + STORAGESIZE - storagep >= n) { 
     storagep += n; 
     return storagep - n; 
    } 
    else 
     return 0; 
} 

void cp(char *s, char *t) { 
    while ((*s++ = *t++)); 
} 

Я получаю эту ошибку:

Access violation reading location 0x0000000000000000.

на этой линии:

if (*lines[i]) {

И я не могу понять, почему. Надеюсь, кто-то может мне это объяснить.

+1

'пространства = mgetline (линия, MAXLINESIZE)> 0 '->' (пробел = mgetline (line, MAXLINESIZE))> 0' – BLUEPIXY

+1

'if (* lines [i]) {' -> 'if (lines [i]) {' – BLUEPIXY

+0

@BLUEPIXY Первый комментарий разумный. Но второй не имеет смысла? – Siliproksi

ответ

1
while (space = mgetline(line, MAXLINESIZE) > 0)... 

выполняет сравнение:

mgetline(line, MAXLINESIZE) > 0 

и сохраняет результат (1 - истина или 0 - ложь) в space.

Для того, чтобы сохранить результат mgetline к space, а затем проверить, если значение больше, то 0:

while ((space = mgetline(line, MAXLINESIZE)) > 0)... 
+0

Я редактирую вопрос в скобках. Потому что у меня все еще есть ошибка. Даже после этого. В любом случае он заслуживает +1. – Siliproksi

+1

@Siliproksi Не редактируйте свой ответ так, как будто вы отказываетесь от ответов. Редактировать должен только добавлять информацию, не изменяя вопрос. – Stargateur

+0

Да, но это не ответ ... Должен ли я оставить вопрос не так? Или я должен принять неправильный ответ? Хотя я и изменил это. Я все еще получаю такую ​​же ошибку. – Siliproksi