C、 如何从另一个结构访问一个结构?

C、 如何从另一个结构访问一个结构?,c,C,我得到一个错误: error: request for member ‘clsf_ptr’ in something not a structure or union 从这个C程序: #include<stdio.h> #define M 3 struct class_stud { char name[16]; char subject[16]; int roll_num; } struct node { int n; struct br

我得到一个错误:

error: request for member ‘clsf_ptr’ in something not a structure or union
从这个C程序:

#include<stdio.h>
#define M 3

struct class_stud
{
    char name[16];
    char subject[16];
    int roll_num;
}

struct node
{
    int n;
    struct branch *p[M];
    struct class_stud cls[M-1];
}*root=NULL;

main()
{
    int clsf_cnt;
    struct class_stud clsf, *clsf_ptr;
    clsf_ptr = &clsf;
    clsf_cnt = 0;
    root = malloc(sizeof (struct node));
    printf("enter source address \n");
    scanf("%s",&root.clsf_ptr[clsf_cnt]->name);
    printf("%s",root.clsf_ptr[clsf_cnt]->name);

    printf("enter key\n");
    scanf("%d",&root.clsf_ptr[clsf_cnt]->key);
    printf("%d",root.clsf_ptr[clsf_cnt] -> key);
    clsf_cnt++;
}
#包括
#定义m3
结构类螺栓
{
字符名[16];
字符主题[16];
int roll_num;
}
结构节点
{
int n;
结构分支*p[M];
结构类螺栓cls[M-1];
}*root=NULL;
main()
{
int clsf_cnt;
结构类螺栓clsf,*clsf\ptr;
clsf_ptr=&clsf;
clsf_cnt=0;
root=malloc(sizeof(struct node));
printf(“输入源地址”);
scanf(“%s”,&root.clsf\u ptr[clsf\u cnt]->名称);
printf(“%s”,root.clsf\u ptr[clsf\u cnt]->名称);
printf(“输入键”);
scanf(“%d”,&root.clsf\u ptr[clsf\u cnt]->key);
printf(“%d”,root.clsf\u ptr[clsf\u cnt]->key);
clsf_cnt++;
}

这个错误是什么意思?

我认为malloc语法是错误的。检查一下。内存未分配。这就是它显示错误的原因。

代码中的
root.clsf_ptr
的任何实例都应替换为
root->clsf_ptr
,这表明
root
是指向结构的指针


您还需要确保成员
clsf\u ptr
位于
节点
结构中。

以下是一些可能有用的常规源代码清理:

#include <stdio.h>
#define M 3

typedef struct
{
  char  name [16];
  char  subject [16];
  int   roll_num;

} Class_stud;


typedef struct
{
  int         n;
  Branch*     p[M];
  Class_stud  cls[M-1];

} Node;



int main()
{
  Node*        root;
  int          clsf_cnt;
  Class_stud   clsf;
  Class_stud*  clsf_ptr;

  clsf_ptr = &clsf;
  clsf_cnt = 0;

  root = malloc (sizeof(Node));

  if(root == NULL)
  {
    /* error handling here */
  }
}
#包括
#定义m3
类型定义结构
{
字符名[16];
字符主题[16];
int roll_num;
}U类螺柱;
类型定义结构
{
int n;
分行*p[M];
U类螺柱cls[M-1];
}节点;
int main()
{
节点*根;
int clsf_cnt;
类螺柱clsf;
等级螺栓*clsf\U ptr;
clsf_ptr=&clsf;
clsf_cnt=0;
root=malloc(sizeof(Node));
if(root==NULL)
{
/*这里的错误处理*/
}
}

以下代码应该适合您。我假设
key
应该是
class\u stud
中的一个成员(根据scanf中的格式选项,是一个有符号整数):

#包括
#定义m3
类型定义结构
{
字符名[16];
字符主题[16];
int roll_num;
int键;
}U类螺柱;
类型定义结构
{
int n;
结构分支*p[M];
结构类螺栓cls[M-1];
}节点;
内部主(空)
{
int clsf_cnt=0;
节点*根;
root=malloc(sizeof(node));
if(root==NULL){
/*处理错误*/
}
printf(“输入源地址”);
scanf(“%s”,&root->cls[clsf\u cnt]->名称);
printf(“%s”,root->cls[clsf\u cnt]->名称);
printf(“输入键”);
scanf(“%d”,&root->cls[clsf\u cnt]->键);
printf(“%d”,root->cls[clsf\u cnt]->键);
clsf_cnt++;
}
您遇到了以下问题:

  • 错误地访问class_螺柱。它是root的一部分,所以您需要root->class\u stud[member]->value
  • 被省略
  • 这两种结构都被更改为类型定义的结构,如答案所示,但是您不需要将它们设置为类型(只使用struct就可以了)
  • 我们只是将root声明为指向节点的指针,而不是声明struct node,然后声明为指针,然后进行赋值
  • 我们不是将结构创建为指针,而是创建指向结构的指针
  • Main应该返回类型
    int
    ,如果不需要参数,请告诉编译器您希望argc为void
我没有做的事:

  • 使用memset()或通过calloc()初始化分配的结构
  • 句柄malloc()失败
  • 编译我的示例(我不知道struct分支是什么)

此代码中存在许多问题。让我们一行一行地浏览一下:

#include<stdio.h>     
#define M 3      

struct class_stud     
{     
  char name[16];     
  char subject[16];     
  int roll_num;     
}      
结构分支的定义在哪里?结构定义中的
p
应该表示什么?为什么
cls
中的元素比
p
少一个

main()
从C99开始,您无法摆脱
main
的隐式类型;必须显式键入才能返回
int
。而且,由于您没有弄乱任何命令行参数,因此最好将参数列表显式设置为
void
,如下所示:

int main(void)
{     
  int clsf_cnt;     
  struct class_stud clsf, *clsf_ptr;     
  clsf_ptr = &clsf;     
上述行动的目的是什么

  clsf_cnt = 0;     
  root = malloc(sizeof (struct node)); 
这很好,但写这篇文章的首选方式是

  root = malloc(sizeof *root);
这样,您就可以确保根据
根用户的类型分配正确的内存量

  printf("enter source address \n");     
  scanf("%s",&root.clsf_ptr[clsf_cnt]->name);     
阿克。这一行有多个问题

首先,
clsf\u ptr
不是
struct节点的成员。您可能打算访问
cls
。其次,由于
root
是指向struct的指针,因此需要使用
->
操作符访问其成员(或者显式地取消对
root
的引用,然后使用
)。第三,
cls[clsf\u cnt]
不是指针类型,因此您可以使用
操作符访问
名称。最后,由于
name
是一种数组类型,因此在传递给
scanf
之前,它将隐式转换为指针类型,因此
是不必要的

为了避免缓冲区溢出,您应该在
%s
转换说明符中设置最大字段宽度,或者使用
fgets()
而不是
scanf()

坚持使用scanf()
,该行应写为

  scanf("%15s", root->cls[clsf_cnt].name);
我在转换说明符中使用了15而不是16,这样我们就为0终止符留下了一个字符

使用fgets(),将写入该行

  fgets(root->cls[clsf_cnt].name, sizeof root->cls[clsf_cnt].name, stdin);
  printf("%s",root.clsf_ptr[clsf_cnt]->name);     
同样,您试图访问的内容不是
root
的成员,并且您的访问操作符是向后的:

  printf ("%s", root->cls[clsf_cnt].name);

  printf("enter key\n");     
  scanf("%d",&root.clsf_ptr[clsf_cnt]->key);     
  printf("%d",root.clsf_ptr[clsf_cnt] -> key);
struct class_stud
没有名为
key
的成员;也许你的意思是
roll\u num

  scanf("%d", &root->cls[clsf_cnt].roll_num);
  printf("%d", root->cls[clsf_cnt].roll_num);    
  clsf_cnt++;     
} 

看起来你发布了一些不完整的东西;确保您向我们展示的代码与您试图构建的代码相同

malloc语法完全正确且惯用。C中不需要从指针强制转换为void。OP有两个问题,错误地取消引用分配的结构,并且缺少成员。而我在执行malloc()的返回时
  printf ("%s", root->cls[clsf_cnt].name);

  printf("enter key\n");     
  scanf("%d",&root.clsf_ptr[clsf_cnt]->key);     
  printf("%d",root.clsf_ptr[clsf_cnt] -> key);
  scanf("%d", &root->cls[clsf_cnt].roll_num);
  printf("%d", root->cls[clsf_cnt].roll_num);    
  clsf_cnt++;     
}