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

时间:2011-01-28 13:36:48

标签: 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 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++;
}

错误是什么意思?

5 个答案:

答案 0 :(得分:3)

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

#include<stdio.h>     
#define M 3      

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

第一个问题;在上面的结构定义之后你需要一个结束;。此外,有趣的是,您没有为namesubject数组的长度定义预处理器宏,但此时这是一个小问题。

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

struct branch的定义在哪里? 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);

这样你就可以根据root的类型分配适量的内存。

  printf("enter source address \n");     
  scanf("%s",&root.clsf_ptr[clsf_cnt]->name);     

确认。这一行有多个问题。

首先,clsf_ptr struct node的成员。您可能打算访问cls。其次,由于root是指向struct的指针,因此您需要使用->运算符来访问其成员(或明确取消引用root,然后使用.)。第三,cls[clsf_cnt] 不是指针类型,因此您可以使用.运算符访问name。最后,由于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_num

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

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

答案 1 :(得分:1)

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

您还需要确保成员clsf_ptr位于node结构中。

答案 2 :(得分:1)

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

#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 */
  }
}

答案 3 :(得分:0)

以下代码应该适合您。我假设 key应该是class_stud中的成员(以及scanf中的格式化选项,有符号整数):

#include<stdio.h>
#define M 3

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

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

int main(void)
{
    int clsf_cnt = 0;
    node *root;

    root = malloc(sizeof(node));
    if (root == NULL) {
       /* handle error */
    }

    printf("enter source address \n");
    scanf("%s",&root->cls[clsf_cnt]->name);
    printf("%s",root->cls[clsf_cnt]->name);

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

您遇到以下问题:

  • 错误地访问class_stud。它是root的一部分,所以你想要root - &gt; class_stud [构件] - GT;值
  • key被省略
  • 两者都被更改为类型定义的结构,如Lundin's回答所示,但是你不需要让它们成为类型(只需使用struct就可以了)。
  • 我们只是声明root是一个指向节点的指针,而不是声明struct node,然后是一个指针,然后进行赋值。
  • 我们不是将结构创建为指针,而是创建指向结构的指针
  • Main应返回类型int,如果您不想要参数,请告诉编译器您希望argc无效。

我没做的东西:

  • 使用memset()或calloc()
  • 初始化已分配的结构
  • 处理malloc()失败
  • 编译我的示例(我不知道结构分支是什么)

答案 4 :(得分:-3)

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