访问函数中的链表 - C.

时间:2018-05-06 13:47:58

标签: c pointers linked-list

我的问题是我想访问我在letters函数中创建的链接列表,并使用它在report函数中打印出来。但是,我似乎无法做到这一点,当我尝试检查charslst_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 :(得分:0)

你刚刚发现了搞乱指针的感觉:)

首先,不要typedef名称中也没有星号的指针类型;否则可读性会受到影响。事实上,由于这个原因,我最初很难跟踪你的代码。

由于上述原因,在这个答案中,我会假装typedef Char * ListofChartypedef 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);

    /* ... */
}

现在查看函数reportletters的签名。前者仅使用指针(Char*),而后者指向指针(Char**)。这就是为什么你的printf在内存中给你不同的位置的原因。 printf中的report正在打印chars所指向的内容; printf中的letters正在打印chars的地址(由lst_ptr持有)。

要打印相同的地址,请打印lst_ptr指向的内容,即:

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

我拿了你发布的代码并应用了我刚刚说过的内容,这是我机器上的输出

gianluca
0x55b67d7db6e0
0x55b67d7db6e0