gpt4 book ai didi

c - 取消引用指向结构中指针的指针时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:04 24 4
gpt4 key购买 nike

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

person_init 中创建一个人并为其命名 (John)。名称是指向字符串的指针。我可以 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 */
}

最佳答案

问题是:

newp->name = &name;

newp->name 现在指向 name,它是 person_init 中的局部变量。一旦 person_init 返回,name 就消失了并且 newp->name 是一个无效指针。之后任何尝试使用它都会导致未定义的行为。

修复:

struct person {
char *name;
};

并将其初始化为

newp->name = name;

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

关于c - 取消引用指向结构中指针的指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com