我有一个结构,其中包含指针指针作为其成员之一。在尝试取消引用此指针时,我不断收到段错误。
在person_init
中创建一个人并为其命名(John)。 Name是指向字符串的指针。我可以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) = '\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 */
}
答案 0 :(得分:2)
问题在于:
newp->name = &name;
newp->name
现在指向name
,这是person_init
中的本地变量。只要person_init
返回,name
就会消失,newp->name
是无效指针。之后任何尝试使用它都会导致未定义的行为。
修正:
struct person {
char *name;
};
并将其初始化为
newp->name = name;
现在newp->name
是name
的副本,即它指向已分配的字符串。