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;
}

调用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
指针(type
char*
),因此这也是正确的

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)