繁体   English   中英

在函数内动态分配结构数组

[英]Dynamically allocating an array of struct inside a function

我无法理解我的 c 实现有什么问题:在函数内动态分配结构数组以在其他函数中使用。

问题是我的 .exe 在读取第一个结构(正确读取)后停止工作。

结构:

struct student
{
    char name1[30], name2[30];
    float grade;
};

功能:

void read(int *n, struct student **a)
{
    if(scanf(" %d", n) == 1)
    {
        int i;
        *a=(struct student*)malloc((*n)*sizeof(struct student*));
        for(i=0; i<*n; i++)
            scanf("%29s %29s %f",(*a)[i].name1, (*a)[i].name2, &(*a)[i].grade);
            //it stops working right after this line is executed
    }
}

主要的:

int main()
{
    int n;
    struct student *a;
    read(&n, &a);
    return 0;
}

警告:

 format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[30]' [-Wformat=]| format '%s' expects argument of type 'char *', but argument 3 has type 'char (*)[30]' [-Wformat=]|

使用 a+i 而不是 a[i] 不会改变任何东西。 我知道 &(*a) 的意思是 a,但我想让一切都尽可能清楚。 我觉得我缺少的动态分配显然有问题。 我在这里阅读了很多问题,但似乎没有什么能解决我的问题。 谢谢你的时间!

编辑 1:我将代码更改为建议:

scanf("%29s %29s %f", a[i].name1, a[i].name2, a[i].grade);

现在我得到了下面的错误。

错误:

错误:在非结构或联合体中请求成员“name1”

编辑 2:所以,该行:

 scanf("%29s %29s %f",*a[i].name1, *a[i].name2, *a[i].grade);

给出错误:

在不是结构或联合的东西中请求成员“name1”

和线:

scanf("%29s %29s %f",(*a)[i].name1, (*a)[i].name2, (*a)[i].grade);

崩溃。

编辑 3:

scanf("%29s %29s %f", (*a)[i].name1, (*a)[i].name2, &(*a)[i].grade);

作品。

这里

*a=(struct student*)malloc((*n)*sizeof(struct student*));
                                                   ^^^^^

您为指向struct student *n指针分配了空间,但似乎您确实想为*n struct student分配空间。

看来你想要:

*a=malloc((*n)*sizeof(struct student));

另请注意, *a[i]*(a[i])相同,但您可能想要(*a)[i] 所以你需要这样的东西:

scanf("%29s %29s %f", (*a)[i].name1, (*a)[i].name2, &(*a)[i].grade);

请注意,在(*a)[i].grade需要&而不是其他两个地方,因为另外两个是数组。

正如@unwind在评论中提到的: scanf是错误的

这个

scanf("%d",&(*n));

应该

scanf("%d", n);

然后你还应该检查返回值,比如

if (scanf("%d", n) != 1)
{
    // Add error handling here
    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM