我收到错误:
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++;
}
错误是什么意思?
答案 0 :(得分:3)
此代码中存在许多问题。让我们逐行浏览:
#include<stdio.h>
#define M 3
struct class_stud
{
char name[16];
char subject[16];
int roll_num;
}
第一个问题;在上面的结构定义之后你需要一个结束;
。此外,有趣的是,您没有为name
和subject
数组的长度定义预处理器宏,但此时这是一个小问题。
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++;
}
您遇到以下问题:
key
被省略int
,如果您不想要参数,请告诉编译器您希望argc无效。我没做的东西:
答案 4 :(得分:-3)
我认为malloc语法错误。一检查一下。内存未分配。说明它显示错误的原因。