我有一个结构,其中包括一个指向指针的指针作为其成员之一。当我试图解除对这个指针的引用时,我一直得到一个segfault。
person_init中创建一个人并为其命名(John)。Name是指向字符串的指针。我在这个功能上没问题。回到printf()函数,我可以再次main()这个名字没有问题。但是当
我输入一个新函数并尝试printf()得到一个segfault。我真的很困惑,因为我很确定printf()被分配到堆中。
我错过了什么?
代码:

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

/* structure with a pointer to pointer member */
struct person {
    char **name;
};


/* allocate space for the strucutre */
int person_init(struct person **p)
{
    struct person *newp = malloc(sizeof(struct person));

    /* give a name, allocated on the heap */
    char *name = malloc(sizeof(char) * 5);
    *name = 'J';
    *(name + 1) = 'o';
    *(name + 2) = 'h';
    *(name + 3) = 'n';
    *(name + 4) = '\0';
    newp->name = &name;
    *p = newp;

    printf("Name in init: %s\n", *(*p)->name); /* this works */

    return 0;
}


void print_name(struct person *p)
{
    printf(*p->name);
}


int main()
{
    struct person *person;
    person_init(&person);
    printf("Name in main: %s\n", *person->name);   /* works */
    print_name(person);                            /* segfault */
}

最佳答案

问题是:

newp->name = &name;

newp->name现在指向name,它是person_init中的一个局部变量。一旦person_init返回,name即消失,newp->name是无效指针。以后任何使用它的尝试都会导致未定义的行为。
修复:
struct person {
    char *name;
};

初始化为
newp->name = name;

现在newp->namename的副本,即它指向分配的字符串。

07-24 09:46
查看更多