struct指针包含指向char(string)的指针,如何为它分配内存?

时间:2018-01-17 02:26:41

标签: c

请原谅我的英语,我的程序崩溃了,但当我将结构成员*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;
}

2 个答案:

答案 0 :(得分:1)

调用C scanf函数的一些正确方法是:

scanf("%d", int*)
scanf("%s", char*)

这是不正确的:

scanf("%s", char**)

考虑工作代码:

int grade;
char name [50];
scanf("%d", &grade);
scanf("%s", name);

此处gradeint变量,因此&grade是指向int变量的指针,其类型为int*。所以这是正确的。

namechar的数组,当传递给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;当它只询问一个指针时,它会指向指针。添加此更改后,它对我来说很好。