C语言 取消引用结构内指针时的隔离错误



我有一个结构,其中包含一个指向指针的指针作为其成员之一。在尝试取消引用此指针时,我不断出现段错误。

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->namename的副本,即它指向分配的字符串。

相关内容

  • 没有找到相关文章

最新更新