Доступ к связанному списку в функции - C - PullRequest
0 голосов
/ 06 мая 2018

Моя проблема в том, что я хочу получить доступ к связанному списку, который я создал в функции letters, и использовать его для распечатки в функции report. Однако кажется, что я не могу этого сделать, и когда я пытаюсь проверить адреса памяти chars и lst_ptr, я вижу, что они отличаются друг от друга. Разве они не должны быть одинаковыми для достижения моей цели?
Заранее спасибо !!!

#include <stdio.h>
#include <stdlib.h>
struct charact {
   char ch;
   int occurs;
   struct charact *next;
};
typedef struct charact Char;

typedef Char * ListofChar;

typedef Char * CharNode_ptr;

void letters(char name[50], ListofChar * chars_ptr);

void report(ListofChar  chars);

Char * createnode(char ch);

int main() {
    char name[50];
    ListofChar chars = NULL;
    scanf("%s", name);
    letters(name, &chars);
    report(chars);
    return 0;
}
Char * createnode(char ch) {
    CharNode_ptr newnode_ptr ;
    newnode_ptr = malloc(sizeof (Char));
    newnode_ptr -> ch = ch;
    newnode_ptr -> occurs = 0;
    newnode_ptr -> next = NULL;
    return newnode_ptr;
}
void letters(char name[50], ListofChar * lst_ptr) {
    int i,j,occs;
    lst_ptr=malloc(100);
    for(i=0;i<strlen(name);i++){
        occs=0;
        for(j=0;j<strlen(name);j++){
            if(name[i]==name[j]){
                occs++;
            }
        }
        lst_ptr[i]=createnode(name[i]);
        lst_ptr[i]->occurs=occs;
        if(i>0){
            lst_ptr[i-1]->next=lst_ptr[i];
        }
    }
    printf("%p\n",lst_ptr);
    return;
}
void report(ListofChar  chars) {
    printf("%p",chars);
return;
}

1 Ответ

0 голосов
/ 06 мая 2018

Вы только что обнаружили, каково это бездельничать с указателями:)

Итак, во-первых, не указывайте typedef типы указателей с именами, в которых также нет звездочки; иначе удобочитаемость пострадает. На самом деле из-за этого мне сначала было трудно следовать вашему коду.

По вышеуказанной причине в этом ответе я буду притворяться, что typedef Char * ListofChar и typedef Char * CharNode_ptr там не было, и вместо этого использовать Char.

В вашей функции main есть следующее объявление:

Char* chars = NULL;

Следует помнить, что указатель chars имеет адрес памяти. chars, однако, указывает на NULL.

Теперь в вашей функции letters вам нужно изменить то, на что указывает chars. Вы можете достичь этого двумя способами: либо обратиться к нему непосредственно из функции, как это

void letters(char name[50]) {
    /* ... */

    chars = malloc(100);

    /* ... */
}

или путем передачи адреса char в letters, что позволяет letters изменять то, что chars указывает на

void letters(char name[50], Char** lst_ptr) {
    /* ... */

    // Note that I'm referring to what lst_ptr is pointing to,
    // that is, chars. At this point of the code, *lst_ptr == chars
    *lst_ptr = malloc(100);

    /* ... */
}

Теперь посмотрите на сигнатуру функций report и letters. Первый принимает только указатель (Char*), а второй принимает указатель на указатель (Char**). Это причина, по которой ваши printf дают вам разные места в памяти. printf в report печатает то, на что указывает chars; в то время как printf in letters печатает адрес chars (который удерживается lst_ptr).

Чтобы напечатать тот же адрес, выведите то, на что указывает lst_ptr, то есть:

printf("%p\n", *lst_ptr);

Я взял опубликованный вами код и применил то, что только что сказал, и это вывод на моем компьютере

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