访问struct中的指针并获取分段错误

访问struct中的指针并获取分段错误,c,C,我试图访问objectName和questionName,但我一直遇到分段错误。当我使用字符数组时,它只打印questionName而不是objectName。我已经为所有东西分配了内存,所以这一定与我如何访问这些指针有关。如果有人能解释我为什么会出现分割错误,那就太好了 #include <stdio.h> #include <string.h> #include <stdlib.h> struct node { char *objectName;

我试图访问objectName和questionName,但我一直遇到分段错误。当我使用字符数组时,它只打印questionName而不是objectName。我已经为所有东西分配了内存,所以这一定与我如何访问这些指针有关。如果有人能解释我为什么会出现分割错误,那就太好了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct node 
{
 char *objectName;
 char *questionName; 
 struct node *left_ptr;
 struct node *right_ptr; 
 };

void treePrint(struct node *ptr) 
{
 if (ptr == NULL)
 {
  return;
 }
 else 
 {
  if (ptr -> questionName != NULL)//ptr is a question 
  {
    printf("question: %s\n", ptr -> questionName);

  //now print the yes and no subtrees:
    treePrint(ptr->left_ptr);
    treePrint(ptr->right_ptr);
  }
   else 
  { // ptr is an object
   printf("object: %s\n", ptr -> objectName);
  }
 }
}



int main(int argc, char const *argv[])
{ 

 struct node *firstquestion = malloc(sizeof(struct node));
 struct node *secondquestion = malloc(sizeof(struct node));

 struct node *firstObject = malloc(sizeof(struct node));
 struct node *secondObject = malloc(sizeof(struct node));
 struct node *thirdObject = malloc(sizeof(struct node));

 strcpy(firstquestion -> questionName, "Does it have a tail?");
 strcpy(secondquestion -> questionName, "Is it round and edible?");

 strcpy(firstObject -> objectName, "A pangolin");
 strcpy(secondObject -> objectName, "Mandeep");
 strcpy(thirdObject -> objectName, "Orange");

 firstquestion -> left_ptr = firstObject;
 firstquestion -> right_ptr = secondquestion;
 secondquestion -> left_ptr = thirdObject;
 secondquestion -> right_ptr = secondObject;


 treePrint(firstquestion); 

  return 0;
}
#包括
#包括
#包括
结构节点
{
char*objectName;
字符*问题名称;
结构节点*left_ptr;
结构节点*right\u ptr;
};
void treePrint(结构节点*ptr)
{
如果(ptr==NULL)
{
返回;
}
其他的
{
如果(ptr->questionName!=NULL)//ptr是一个问题
{
printf(“问题:%s\n”,ptr->questionName);
//现在打印“是”和“否”子树:
树打印(ptr->左ptr);
树打印(ptr->右ptr);
}
其他的
{//ptr是一个对象
printf(“对象:%s\n”,ptr->objectName);
}
}
}
int main(int argc,char const*argv[]
{ 
结构节点*firstquestion=malloc(sizeof(结构节点));
结构节点*secondquestion=malloc(sizeof(结构节点));
结构节点*firstObject=malloc(sizeof(结构节点));
结构节点*secondObject=malloc(sizeof(结构节点));
结构节点*thirdObject=malloc(sizeof(结构节点));
strcpy(firstquestion->questionName,“它有尾巴吗?”);
strcpy(第二个问题->问题名称,“它是圆的和可食用的吗?”);
strcpy(firstObject->objectName,“穿山甲”);
strcpy(secondObject->objectName,“Mandeep”);
strcpy(thirdObject->objectName,“橙色”);
firstquestion->left_ptr=firstObject;
第一个问题->右侧问题=第二个问题;
第二个问题->左\右=第三个问题;
secondquestion->right_ptr=secondObject;
treePrint(第一个问题);
返回0;
}

您还需要
malloc()
问题名,
对象名
等等。但是您也可以做一些更简单的事情,像这样使用
strdup()

ptr->questionName = strdup("Does it have a tail?");
还有一件事,您需要对照
NULL
检查
malloc()
的返回值


注意:请不要在
->
操作符周围使用空格,这看起来很糟糕。另外,要与空白区的使用保持一致,使用足够的空白区,不要太少,也不要太多。只需与您自己的风格保持一致。

您还需要
malloc()
问题名,
对象名
等等。但是您也可以做一些更简单的事情,像这样使用
strdup()

ptr->questionName = strdup("Does it have a tail?");
还有一件事,您需要对照
NULL
检查
malloc()
的返回值


注意:请不要在
->
操作符周围使用空格,这看起来很糟糕。另外,要与空白区的使用保持一致,使用足够的空白区,不要太少,也不要太多。只是要与你自己的风格保持一致。

你没有为
firstquestion->questionName
分配内存,因此
strcpy(firstquestion->questionName,“它有尾巴吗?”)是未定义的行为。您没有为
firstquestion->questionName
分配内存,因此
strcpy(firstquestion->questionName,“它有尾巴吗?”)是未定义的行为。我会在打印方法中这样做吗:struct node*objectName=malloc(sizeof(struct node))@不,您必须分配正确数量的字符,请注意
objectName
的类型为
char
。你是在不理解的情况下做作业吗?只是为了传递?但是questionName在struct中,所以我不知道如何给它一个内存块。通常,我声明一个新变量并将其分配给内存(如所示)
malloc()。内存分配远不容易理解。您需要阅读更多内容,然后尝试实现。我会在print方法中这样做吗:struct node*objectName=malloc(sizeof(struct node))@不,您必须分配正确数量的字符,请注意
objectName
的类型为
char
。你是在不理解的情况下做作业吗?只是为了传递?但是questionName在struct中,所以我不知道如何给它一个内存块。通常,我声明一个新变量并将其分配给内存(如所示)
malloc()。内存分配远不容易理解。您需要阅读更多内容,然后尝试实现。