Вы только что обнаружили, каково это бездельничать с указателями:)
Итак, во-первых, не указывайте 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