[英]Struct pointer contains pointer to char (string) , how to allocate memory for it?
请问我的英语,我的程序按原样崩溃,但是当我将结构成员*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;
}
调用C scanf
函数的一些正确方法是:
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
指针(类型char*
)。 所以这也是正确的。
char name [50];
scanf("%s", &name);
&name
是指向50
char
数组的指针,类型为char(*)[50]
,因此从技术上讲这是不正确的,但由于指针与&name[0]
或(char*) name
具有相同的值,因此它确实起作用(char*) name
。
struct a { int x; int y; };
a b;
scanf("%d", &b);
该代码也是错误的,但由于&b
(在大多数情况下)与&b.x
具有相同的值(大多数情况下),因此它&b.x
,因此该代码将具有与
scanf("%d", &b.x);
尽管指针类型不同。 无论如何,不要依赖行为。
int grade;
scanf("%d", grade);
由于grade
不是指向int
的指针,因此会崩溃。
现在考虑动态分配的数组(当然,请记住在使用完数组后调用free(name)
)。
char* name;
name = (char*) malloc(50 * sizeof(char));
考虑改用calloc
。 但是无论如何,在这种情况下, name
是一个char
指针,指向已分配内存的第一个字节。 所以
scanf("%s", name)
是正确的,因为name
是指向分配的内存的char*
,如上所述。
scanf("%s", &name)
&name
是指向char指针name
的指针,类型为char**
。 不正确。
总之,使用&
明智的。 不要坚持使用scanf("format", &variables)
。
无关的注释:请勿使用(students+i)->name
,而应使用students[i].name
。 更清楚了。
首先,在scanf(“%s”&(students + i)-> name)中删除'&',这是因为它已经是一个指针,并且'&'使其成为指向指针的指针只是一个指针。 添加此更改后,对我来说效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.