C 结构指针包含指向字符(字符串)的指针,如何为其分配内存?
请原谅我的英语,我的程序崩溃了,但是当我将结构成员C 结构指针包含指向字符(字符串)的指针,如何为其分配内存?,c,C,请原谅我的英语,我的程序崩溃了,但是当我将结构成员*name(string)更改为name[50],并删除命令(students+i)->name=(char*)malloc(50*sizeof(char))程序运行良好,所以我想问题是,在为每个名称动态分配内存时,我做错了什么 #include <stdio.h> #include <stdlib.h> struct student { char *name; int grade; }; int ma
*name
(string)更改为name[50]
,并删除命令(students+i)->name=(char*)malloc(50*sizeof(char))代码>程序运行良好,所以我想问题是,在为每个名称动态分配内存时,我做错了什么
#include <stdio.h>
#include <stdlib.h>
struct student
{
char *name;
int grade;
};
int main()
{
int student_number = 0,i;
struct student *students = NULL;
printf("Give the number of students: ");
scanf("%d",&student_number);
students = (struct student*)malloc(student_number * sizeof(struct student));
for(i=0;i<student_number;i++)
{
(students+i)->name = (char*)malloc(50 * sizeof(char));
system("CLS");
printf("Give the name of student no. %d: ",i+1);
scanf(" %s",&(students+i)->name);
printf("Give the grade of student no. %d: ",i+1);
scanf("%d",&(students+i)->grade);
}
system("CLS");
for(i=0;i<student_number;i++)
{
printf("%d. %s %d\n",i+1,(students+i)->name,(students+i)->grade);
}
system("PAUSE");
return 0;
}
#包括
#包括
结构学生
{
字符*名称;
国际等级;
};
int main()
{
int student_number=0,i;
struct student*students=NULL;
printf(“给出学生人数:”);
scanf(“%d”和学生号);
学生=(结构学生*)malloc(学生编号*大小)(结构学生));
对于(i=0;iname=(char*)malloc(50*sizeof(char));
系统(“CLS”);
printf(“给出学生编号%d:,i+1的姓名);
scanf(“%s”&(学生+i)->姓名);
printf(“给出学生编号%d:,i+1的分数);
scanf(“%d”和(学生+i)->年级);
}
系统(“CLS”);
对于(i=0;在南,(学生+i)->年级);
}
系统(“暂停”);
返回0;
}
调用Cscanf
函数的一些正确方法是:
scanf("%d", int*)
scanf("%s", char*)
这是不正确的:
scanf("%s", char**)
以工作守则为例:
int grade;
char name [50];
scanf("%d", &grade);
scanf("%s", name);
这里的grade
是一个int
变量,因此&grade
是指向int
变量的指针,其类型为int*
。因此这是正确的
name
是一个char
数组,当传递到scanf
时,它会衰减为指向数组第一个元素的char
指针(typechar*
),因此这也是正确的
char name [50];
scanf("%s", &name);
&name
是指向50
char
s数组的指针,其类型为char(*)[50]
,因此从技术上讲这是不正确的,但它恰好起作用,因为指针的值与&name[0]
或(char*)name
相同
struct a { int x; int y; };
a b;
scanf("%d", &b);
此代码也是错误的,但恰好起作用,因为&b
与&b.x
具有相同的值(大多数情况下),因此该代码将具有与相同的功能
scanf("%d", &b.x);
尽管指针类型不同,但无论如何,不要依赖于行为
int grade;
scanf("%d", grade);
这会崩溃,因为grade
不是指向int
的指针
现在考虑动态分配的数组(当然,记住在使用它时调用<代码>自由(名称)< /代码>)。
考虑改用
calloc
。但是无论如何,在这种情况下,name
是一个char
指针,指向分配内存的第一个字节。所以
scanf("%s", name)
是正确的,因为name
是一个指向分配内存的char*
,如上所述
scanf("%s", &name)
&name
是指向字符指针name
,其类型为char**
。不正确
总之,明智地使用&
。不要拘泥于模式scanf(“格式”和变量)
不相关的注意事项:不要使用(students+i)->名称
,而是使用students[i]。名称
更清晰。首先,删除scanf中的“&”(%s“&(students+i)->名称)
这是因为它已经是一个指针,“&”使它成为指向指针的指针,当它只要求一个指针时。添加此更改后,它对我来说很好。我认为这是&(students+I)->名称
在scanf
中。它将指针的地址作为参数,而不是存储名称的内存地址。scanf(“%s”&(students+i)->name);
-->scanf(“%s”,(students+i)->name)
或scanf(“%s”,students[i].name);
“避免在评论中回答问题。”它成功了,谢谢你们!程序现在运行良好,但是如果我将这个命令scanf(“%d”&(students+i)->grade)更改为scanf(“%d”,(students+i)->grade);它崩溃了,只是为了学习,有人能解释为什么吗?别忘了释放分配给char*/struct*的内存,否则会导致memleak@cslrnr谢谢,补充道。超级答案!谢谢,非常感谢!
scanf("%s", &name)