Проблема доступа к связанному списку в C с printf в определенной функции (доступ к памяти) - PullRequest
0 голосов
/ 31 октября 2019

Когда я пытаюсь скомпилировать код ниже, исполняемый файл не открывается. Я также попытался отладить, и я получил эту ошибку в printf строки viewNode: Не удалось выполнить команду MI: -data -valu-expression (l) -> info Сообщение об ошибке от серверной части отладчика: Не удается получить доступ к памяти по адресу 0xeb

Теперь я понимаю, что пытаюсь получить доступ к области памяти, которую не должен, но где проблема?

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

typedef struct char_node *char_list;

struct char_node{
    char info;
    char_list next;
}char_node;

char_list makesNode(void);
char_list makesValueNode(char value);
char_list makesList(char_list l, char nome[]);
void viewNode(char_list l);
void viewList(char_list l);

int main(){
    char_list nuovo;
    char nome[] = "Ugo";
    makesList(nuovo, nome);
    if(nuovo != NULL)
        viewList(nuovo);

    return 0;
}

char_list makesNode(void){
    return (char_list)malloc(sizeof(struct char_node));
}

char_list makesValueNode(char value){
    char_list li = NULL;
    li = makesNode();
    li -> info = value;
    li -> next = NULL;
    return li;
}

char_list makesList(char_list nuovo, char nome[]){
    char_list head = NULL;
    int l = strlen(nome);
    l = l - 1;
    while(l >= 0 ){
        nuovo = makesValueNode(nome[l]);
            if(nuovo != NULL){
                nuovo -> next = head;
                head = nuovo;
                l = l - 1;
            }
    }
    return nuovo;
}

void viewNode(char_list l){
    printf("%c", l->info);
}

void viewList(char_list l){
    while(l != NULL){
        viewNode(l);
        l = l -> next;
    }
}

Ответы [ 2 ]

1 голос
/ 31 октября 2019

makeList возвращает указатель char_list, но вы не назначаете его своей переменной.

Кроме того, makesList никогда не использует параметр nuovo, в этом нет необходимости.

Так и должно быть:

int main(){
    char nome[] = "Ugo";
    char_list nuovo = makesList(nome);
    if(nuovo != NULL)
        viewList(nuovo);
    return 0;
}

char_list makesList(char nome[]){
    char_list nuovo;
    char_list head = NULL;
    int l = strlen(nome);
    l = l - 1;
    while(l >= 0 ){
        nuovo = makesValueNode(nome[l]);
        if(nuovo != NULL){
            nuovo -> next = head;
            head = nuovo;
            l = l - 1;
        }
    }
    return nuovo;
}

DEMO

0 голосов
/ 31 октября 2019

Короткий ответ: вы не сохраняете свой недавно созданный список таким, каким вы его думаете, поэтому, когда вы приходите его печатать, вы печатаете мусор.

int main(){
    char_list nuovo;       // <--- uninitialised pointer
    char nome[] = "Ugo";
    makesList(nuovo, nome);    // <--- not storing return value
    if(nuovo != NULL)
        viewList(nuovo);    // <--- printing some random memory, not your new list

    return 0;
}

Если вы измените на:

    char_list nuovo = NULL;
    ...
    nuovo = makesList(nuovo, nome);

Вы должны найти, что это работает так, как вы ожидаете, но стоит немного подумать о том, действительно ли вы хотите, чтобы это работало таким образом.

Похоже, вы надеялись, чтоnuovo был волшебным образом обновлен функцией, но для этого вам нужно будет передать на нее указатель (... и это другое обсуждение!).

Наконец, как указал @Barmar, typedef использование указателей - это плохая привычка, и тем более легко оставлять их неинициализированными, как и вы, просто потому, что они не выглядят как указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...