首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递指针的结构

传递指针的结构
EN

Stack Overflow用户
提问于 2015-12-19 06:41:09
回答 2查看 66关注 1票数 0

假设我有这样的指针结构:

代码语言:javascript
复制
typedef struct person {
    char* name;
    struct person* neighbor;
} person;

typedef struct jail {
    struct person* first_inmate;
} jail;

我编写了以下代码,以便将这些结构分配到堆中,以便它们在本地作用域外持久存在:

代码语言:javascript
复制
void create_person(const char* person_name, person** person_ptr2ptr) {
    if (!*person_ptr2ptr)
        *person_ptr2ptr = (person*) malloc(sizeof(person));
    (*person_ptr2ptr)->name = (char*)person_name;
    (*person_ptr2ptr)->neighbor = NULL;
}

jail* create_jail(void) {
    jail* _jail;
    _jail = (jail*) malloc(sizeof(jail));
    _jail->first_inmate = NULL;
    return _jail;
}

为什么我不能像这样把这些person插入到jail中呢?

代码语言:javascript
复制
void imprison(jail* jail_ptr, person* person_ptr) {
    person* last_inmate = jail_ptr->first_inmate;
    while (last_inmate != NULL)
        last_inmate = last_inmate->neighbor;
    last_inmate = person_ptr;
}

当我试图访问san_jose_jail->first_inmate或任何囚犯的名字时,我会遇到一个片段错误:

代码语言:javascript
复制
int main(void) {
    person* alice_ptr = NULL;
    person* bob_ptr = NULL;
    create_person("Alice", &alice_ptr);
    create_person("Bob", &bob_ptr);

    jail* san_jose_jail = create_jail();
    imprison(san_jose_jail, alice_ptr);
    imprison(san_jose_jail, bob_ptr);
    // Why don't the pointers match?
    printf("Alice is at %p\n", (void*)alice_ptr);
    printf("First prisoner is at %p\n", (void*)san_jose_jail->first_inmate);
    // Segfaults after next line
    printf("Last prisoner's name is %s\n", san_jose_jail->first_inmate->neighbor->name);

    free(san_jose_jail);
    free(alice_ptr);
    free(bob_ptr);
    return 0;
}

我的目标是存储一个哈希表,其值是指向结构的指针,我可以插入/访问指针本身,但是当我在插入函数的作用域之外访问它们时,指针可以取消对垃圾的引用。我认为上面的例子抽象出了问题,并将帮助我理解如何做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-19 06:50:23

问题在于这一说法:

代码语言:javascript
复制
last_inmate = person_ptr;

您正在修改neighbor指针的本地副本,而不是结构中的指针不动。imprison方法应该如下所示:

代码语言:javascript
复制
void imprison(jail* jail_ptr, person* person_ptr) {
    person** last_inmate = &jail_ptr->first_inmate;
    while (*last_inmate != NULL)
        last_inmate = &(*last_inmate)->neighbor;
    *last_inmate = person_ptr;
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-19 06:50:06

要想把某人送进监狱,只需在名单一开始就加进去:

代码语言:javascript
复制
void imprison(jail* jail_ptr, person* person_ptr) {
    person_ptr->neighbor = jail_ptr->first_inmate;
    jail_ptr->first_inmate = person_ptr;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34368102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档