你如何在C中创建一个结构数组?

Amn*_*ep7 89 c arrays struct

我正在尝试创建一个结构数组,其中每个结构代表一个天体,用于解决我正在课堂上工作的问题.我没有那么多结构体验,这就是为什么我决定尝试使用它们而不是一大堆数组,但是,我继续遇到许多不同的错误,即使我试图实现这些技术我已经在各种线程和stackoverflow上看到过(例如在CC中的结构数组 - 初始化结构数组),但并非所有这些都适用,所以我无法完全复制的方式做它.在我向您展示我正在尝试做的事情之前,只需要预先警告,因为我已经醒了很长时间,因此我需要睡觉几个小时才能回复评论/问题/答案.我真的很抱歉,但是在忙碌了一天并且已经解决了这个问题好几个小时之后我真的很累.

对于那些已经阅读过这一点的人的进一步信息:我不需要任何这些是动态的,我知道/事先确定一切的大小.我还需要这个全局数组(喘气 GLOBAL VARIABLES),因为我在几个不同的方法中访问它,这些方法已经定义了参数(即GLUT方法).

这就是我在标题中定义结构的方式:

struct body
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
};
Run Code Online (Sandbox Code Playgroud)

在定义结构内部之前,我有一个其他全局变量的列表,其中一个是这个结构的数组(基本上,如果我在模糊的说话中太不清楚,下面这一行高于上面的东西):

struct body bodies[n];
Run Code Online (Sandbox Code Playgroud)

只是你知道,n这是我合法定义的东西(即#define n 1).

我在几个不同的方法中使用这个数组,但最容易和最少占用空间的是我的main的简化形式,我初始化每个结构中的所有变量,只是为了在我修改它们之前设置变量办法:

  int a, b;
 for(a = 0; a < n; a++)
 {
        for(b = 0; b < 3; b++)
        {
            bodies[a].p[b] = 0;
            bodies[a].v[b] = 0;
            bodies[a].a[b] = 0;
        }
        bodies[a].mass = 0;
        bodies[a].radius = 1.0;
 }
Run Code Online (Sandbox Code Playgroud)

我正面临的当前错误是nbody.c:32:13: error: array type has incomplete element type第32行是我正在构建结构数组的地方.

感谢您提供的任何和所有帮助,我保证我会在最迟的12小时后回复您.

最后一个澄清,标题我的意思是上面的空格,int main(void)但在同一个*.c文件中.

nim*_*ims 99

#include<stdio.h>
#define n 3
struct body
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
};

struct body bodies[n];

int main()
{
    int a, b;
     for(a = 0; a < n; a++)
     {
            for(b = 0; b < 3; b++)
            {
                bodies[a].p[b] = 0;
                bodies[a].v[b] = 0;
                bodies[a].a[b] = 0;
            }
            bodies[a].mass = 0;
            bodies[a].radius = 1.0;
     }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这很好用.顺便问一下你的问题不是很清楚,所以要将源代码的布局与上面的内容相匹配.


Abd*_*eem 14

初始化结构数组的另一种方法是显式初始化数组成员。如果结构和数组成员不多,这种方法既实用又简单。

每次声明结构变量时,请使用说明typedef符避免重复使用该struct语句:

typedef struct
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
}Body;
Run Code Online (Sandbox Code Playgroud)

然后声明你的结构数组。每个元素的初始化都伴随着声明:

Body bodies[n] = {{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}, 
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}, 
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}};
Run Code Online (Sandbox Code Playgroud)

重复一遍,如果您没有太多数组元素和大型结构成员,并且如您所说,如果您对更动态的方法不感兴趣,那么这是一个相当简单和直接的解决方案。如果 struct 成员使用命名的枚举变量(而不仅仅是上面示例中的数字)进行初始化,则这种方法也很有用,从而使代码阅读器可以更好地概览结构及其成员在某些情况下的用途和功能。应用程序。


Chr*_*tos 12

我想你也可以这样写.我也是学生,所以我理解你的斗争.有点迟到的反应但还可以.

#include<stdio.h>
#define n 3

struct {
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
}bodies[n];
Run Code Online (Sandbox Code Playgroud)


Dou*_*han 11

所以使用以下方法将它们组合在一起malloc():

int main(int argc, char** argv) {
    typedef struct{
        char* firstName;
        char* lastName;
        int day;
        int month;
        int year;

    }STUDENT;

    int numStudents=3;
    int x;
    STUDENT* students = malloc(numStudents * sizeof *students);
    for (x = 0; x < numStudents; x++){
        students[x].firstName=(char*)malloc(sizeof(char*));
        scanf("%s",students[x].firstName);
        students[x].lastName=(char*)malloc(sizeof(char*));
        scanf("%s",students[x].lastName);
        scanf("%d",&students[x].day);
        scanf("%d",&students[x].month);
        scanf("%d",&students[x].year);
    }

    for (x = 0; x < numStudents; x++)
        printf("first name: %s, surname: %s, day: %d, month: %d, year: %d\n",students[x].firstName,students[x].lastName,students[x].day,students[x].month,students[x].year);

    return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

  • 你的malloc系列应该有numStudents*sizeof(STUDENT)吗? (8认同)
  • @JohnSmith你误会了;再读一遍。“ students”的大小是“所指的”的大小,即“ sizeof(STUDENT)”,而不是“ sizeof(STUDENT *)”。您正在犯一个确切的错误,即应该防止`ptr = malloc(num * sizeof * ptr)`这个惯用语。在[此处](http://coliru.stacked-crooked.com/a/477e444a4cbcb96a)进行检查(请注意,与大多数现代PC一样,服务器具有8个字节的指针,因此大小分别为8和32,而不是4和20)。 (2认同)

vrk*_*001 8

移动

struct body bodies[n];
Run Code Online (Sandbox Code Playgroud)

之后

struct body
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
};
Run Code Online (Sandbox Code Playgroud)

休息一切看起来很好.