如何在 C 语言中创建结构数组?

我正在尝试建立一系列结构每个结构代表一个天体。

我对结构没有那么多的经验,这就是为什么我决定尝试使用它们而不是一大堆数组的原因。然而,我不断遇到许多不同的错误。我试图实现我在各种线程和 StackOverflow (比如 C 中的结构体数组初始化结构数组)上看到的技术,但并非所有技术都适用。

对于那些已经阅读到这里的人,进一步的信息是: 我不需要这些东西是动态的,我事先知道/定义了所有东西的大小。我还需要它是一个全局数组,因为我要在几个不同的方法中访问它,这些方法都有定义的参数(即 GLUT 方法)。

这就是我在头部定义 struct 的方法:

struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};

在定义 struct 的内部之前,我有一个全局变量的列表,其中之一就是 struct 的数组(基本上,如果我说得不够清楚,下面这行就在上面的内容之上) :

struct body bodies[n];

正如你所知道的,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;
}

我当前面临的错误是 nbody.c:32:13: error: array type has incomplete element type,其中第32行是构造结构数组的地方。

最后一个说明,我说的头是指 int main(void)之上的空间,但是在同一个 *.c文件中。

663279 次浏览

让开

struct body bodies[n];

之后

struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};

休息看起来都很好。

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

这样挺好的。你的问题不是很清楚的方式,所以匹配的布局,你的源代码与以上。

这个错误意味着编译器无法在声明 struct 数组之前找到 struct 类型的定义,因为你说你在头文件中有 struct 的定义,错误出现在 nbody.c中,那么你应该检查是否正确地包含了头文件。 检查您的 #include,并确保在声明任何该类型的变量之前完成了结构的定义。

因此,通过使用 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);
}

我觉得你也可以这么写。我也是一个学生,所以我理解你的挣扎。有点晚了,不过没关系。

#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];

使用指针的解决方案:

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




int main()
{
struct body *bodies = (struct body*)malloc(n*sizeof(struct body));
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;
}

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

使用 typedef说明符可以避免每次声明 struct 变量时都重复使用 struct语句:

typedef struct
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
}Body;

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

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

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

您可以使用与创建数字数组相同的方式进行此操作,但是将元素的值包装在大括号中,如下->

struct Wrestler studs[count] = {
{"John", "Cena"},
{"The", "Undertaker"},
{"The", "Big Show"},
{"The", "Rock"},
{"Triple", "H"},
{"Scott", "Hall"},
{"Roman", "Reings"},
{"Dean", "Ambrose"}};

这是完整代码

#include <stdio.h>


struct Wrestler
{
char firstName[20];
char secondName[20];
};


void pIntro(struct Wrestler *s)
{
printf("Hi, I am %s %s.\n", s->firstName, s->secondName);
};


int main(int argc, char const *argv[])
{
#define count 8
struct Wrestler studs[count] = {
{"John", "Cena"},
{"The", "Undertaker"},
{"The", "Big Show"},
{"The", "Rock"},
{"Triple", "H"},
{"Scott", "Hall"},
{"Roman", "Reings"},
{"Dean", "Ambrose"}};


for (int i = 0; i < count; i++)
{
pIntro(&(studs[i]));
}


return 0;
}