C - Невозможно получить доступ к адресу памяти - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь прочитать каждую строку файла и вставить в связанный список, но при передаче str [500] функции не обращается к адресу памяти, вот мой код

char str[500];
FILE *f1;
f1 = fopen("text.txt", "r");
while (!feof (f1)){
    fscanf (f1, "%s", str);
    insertFirst(str);
}
fclose(f1);

printList();

и вот мой код вставки связанного списка

void insertFirst(char* name) {

struct node *link = (struct node*) malloc(sizeof(struct node));
strcpy(link->nodename,name);

link->next = head;
head = link;
}

структура моего связанного списка

struct node {
char nodename[500];
struct node *next;
};

struct node *head = NULL;
struct node *current = NULL;

Когда я отлаживаю код, в таблицах наблюдений, параметр функции insertFirst, char * name показывает это: Ошибка не может получить доступ к адресу памяти 0x3847aef1

1 Ответ

0 голосов
/ 09 июня 2018

Сначала проверьте возвращаемое значение fopen() независимо от того, успешно оно или нет.открыть справочную страницу fopen().например,

f1 = fopen("text.txt", "r");
if(f1 == NULL ) {
        fprintf(stderr,"file doesn't exist \n");
        return 0;
}

Во-вторых, прочитайте, почему feof() здесь не так /5459862/pochemu-while-feof-file-vsegda-neverno Вместо этого проверьте возвращаемое значение fscanf().например,

while (fscanf (f1, "%s", str) == 1) {
        insertFirst(str);
}

Также не требуется указывать тип malloc.вот пример кода

struct node {
        char nodename[500];
        struct node *next;
};
struct node *head = NULL;
struct node *current = NULL; 
void insertFirst(char* name) {
        struct node *link = malloc(sizeof(struct node)); /* create new node by dynamic memory */
        strcpy(link->nodename,name); /* copy the data */
        link->next = head; 
        head = link; /* update the head every time */
}
void printList(void) {
        struct node *temp = head; /* assign head to temp & do operation, don't modify head here since head is declared globally */
        while(temp) {
                printf("name : %s \n",temp->nodename);
                temp = temp->next;
        }
}
int main(void) {
        char str[500];
        FILE *f1 = fopen("text.txt", "r");
        if(f1 == NULL ) {
                fprintf(stderr,"file doesn't exist \n");
                return 0;
        }
        while (fscanf (f1, "%s", str) == 1) { /* it returns no of items readon success */
                insertFirst(str);/* pass the str read from file to insertFirst() function */
        }
        fclose(f1);
        printList();
        return 0;
}
...