请原谅我的英语,我的程序崩溃了,但当我将结构成员*name
(字符串)更改为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;
}
答案 0 :(得分:1)
调用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
相同的值。
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
的指针。
现在考虑动态分配的数组(当然,记得在使用完毕后调用free(name)
)。
char* name;
name = (char*) malloc(50 * sizeof(char));
请考虑使用calloc
。但无论如何,在这种情况下,name
是一个char
指针,指向分配的内存的第一个字节。所以
scanf("%s", name)
是正确的,因为name
是指向已分配内存的char*
,如上所述。
scanf("%s", &name)
&name
是指针name
的指针,类型为char**
。不正确。
总之,明智地使用&
。不要坚持模式scanf("format", &variables)
。
无关注意:请勿使用(students+i)->name
,而是使用students[i].name
。它更加清晰。
答案 1 :(得分:0)
首先,删除&#39;&amp;&#39;在scanf中(&#34;%s&#34;&amp;(学生+ i) - &gt;名称) 这是因为它已经是一个指针,并且&#39;&amp;&#39;当它只询问一个指针时,它会指向指针。添加此更改后,它对我来说很好。