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应该返回类型
,如果不需要参数,请告诉编译器您希望argc为voidint
- 使用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++;
}