我有一个结构,其中包括一个指向指针的指针作为其成员之一。当我试图解除对这个指针的引用时,我一直得到一个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->name
是name
的副本,即它指向分配的字符串。