我有一个结构,其中包含一个指向指针的指针作为其成员之一。在尝试取消引用此指针时,我不断出现段错误。
在person_init
中创建一个人并给它起个名字(约翰(。名称是指向字符串的指针。我printf()
这个函数没有问题。回到main()
函数,我再次可以printf()
名称没有问题。但是当 我输入一个新函数并尝试printf()
出现段错误。我真的很困惑,因为我很确定name
被分配到堆上。
我在这里错过了什么?
法典:
#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) = ' ';
newp->name = &name;
*p = newp;
printf("Name in init: %sn", *(*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: %sn", *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
的副本,即它指向分配的字符串。