C 创建结构的动态数组

C 创建结构的动态数组,c,arrays,dynamic,struct,C,Arrays,Dynamic,Struct,我需要创建一个结构数组,但我必须从文件中读取数组大小。我的问题是我可能用错了指针。我不能使用全局变量。以下是我编写的代码: #include <stdio.h> #include <stdlib.h> struct driver { int *amount; int ADT1[9]; int ADO1[9]; }; struct driver totaldrivers[*amount]; #包括 #包括 结构驱动程序 { 整数

我需要创建一个结构数组,但我必须从文件中读取数组大小。我的问题是我可能用错了指针。我不能使用全局变量。以下是我编写的代码:

#include <stdio.h>
#include <stdlib.h>
struct driver
{
       int *amount;
       int ADT1[9];
       int ADO1[9];
};

struct driver totaldrivers[*amount];
#包括
#包括
结构驱动程序
{
整数*金额;
int-ADT1[9];
int ADO1[9];
};
结构驱动程序totaldrivers[*金额];
我得到的错误(2)是“此处未声明的数量(不在函数中)”和“不知道'totaldrivers'的存储大小”。我试着直接给*amount一个值,但运气不好,即使如此,该值也必须由用户创建的文件获取,并且数字是第一行。这就是我的问题所在。(.txt)文件格式为:

4(条目数量)
1234567899786775645(ADT1,ADO1)
.
.
.
我肯定我犯过新手错误,所以如果这个问题很愚蠢,请原谅我。

而不是

struct driver totaldrivers[*amount];
设置一个指针来引用它,然后在知道需要的大小时从堆中分配数组

struct driver totaldrivers[];
int amount=7; /* for example */
totaldrivers=malloc(sizeof(struct driver)*amount);
/* Apology for the typo; I wrote "driver=" the first time. Good catch! */
您可能也不希望在结构中包含“int*amount”

struct driver totaldrivers[*amount];
设置一个指针来引用它,然后在知道需要的大小时从堆中分配数组

struct driver totaldrivers[];
int amount=7; /* for example */
totaldrivers=malloc(sizeof(struct driver)*amount);
/* Apology for the typo; I wrote "driver=" the first time. Good catch! */

您可能也不希望在结构中包含“int*amount”。

我假设您的结构的内容应该如下所示(我已经删除了
int*amount
):

要创建这些结构的动态1D数组,首先创建指向
驱动程序的1D数组的指针:

struct driver *pDriver;
接下来,为数组中需要的元素数量分配内存。这应该是已知的(
N
):

如果要记录元素的数量,应执行以下操作:

struct driver
{
    int ADT1[9];
    int ADO1[9];
};

struct driverArray
{
    int numDrivers;
    struct driver *pDriver;
};

struct driverArray driverArr;

driverArr.numDrivers = N;
driverArr.pDriver = malloc(driverArr.numDrivers * sizeof(*driverArr.pDriver));

我假设您的结构的内容如下(我已删除
int*amount
):

要创建这些结构的动态1D数组,首先创建指向
驱动程序的1D数组的指针:

struct driver *pDriver;
接下来,为数组中需要的元素数量分配内存。这应该是已知的(
N
):

如果要记录元素的数量,应执行以下操作:

struct driver
{
    int ADT1[9];
    int ADO1[9];
};

struct driverArray
{
    int numDrivers;
    struct driver *pDriver;
};

struct driverArray driverArr;

driverArr.numDrivers = N;
driverArr.pDriver = malloc(driverArr.numDrivers * sizeof(*driverArr.pDriver));
在这里,使用数组(第一种方法):

*amount
是驱动程序结构数组的大小。这是定义数组大小的错误方法!! 有很多方法可以定义数组的大小,其中一些方法是:

1) 使用define指令的预处理器:
#定义大小12

2) 全局变量:int size 12

您还可以使用指针(第二种方法):

你不应该把你的代码复杂化,放轻松

在这里,使用数组(第一种方法):

*amount
是驱动程序结构数组的大小。这是定义数组大小的错误方法!! 有很多方法可以定义数组的大小,其中一些方法是:

1) 使用define指令的预处理器:
#定义大小12

2) 全局变量:int size 12

您还可以使用指针(第二种方法):


你不应该把你的代码复杂化,放轻松

另一种方法是使用C99中引入的动态堆栈分配工具。只需确保您的编译器是C99编译器

正如其他人所说的那样,不要使用数量

struct driver
{
    int ADT1[9];
    int ADO1[9];
};
引入一个函数来做任何你想做的事情。在这里分配数组

void RunWith(int amount)
{
    struct driver totaldrivers[amount];

    ... 
}
在调用者中,传入金额

int main ()
{
    RunWith(25);
    ...
    return 0;
}

不需要malloc或free。

另一种方法是使用C99中引入的动态堆栈分配功能。只需确保您的编译器是C99编译器

正如其他人所说的那样,不要使用数量

struct driver
{
    int ADT1[9];
    int ADO1[9];
};
引入一个函数来做任何你想做的事情。在这里分配数组

void RunWith(int amount)
{
    struct driver totaldrivers[amount];

    ... 
}
在调用者中,传入金额

int main ()
{
    RunWith(25);
    ...
    return 0;
}


不需要malloc或free。

结构数组应该是全局的吗?
amount
不是全局变量,您需要一个初始化的
驱动程序
结构实例来访问它。我认为关键是读取第一行并使用它来调整数组的大小,不要把它放在你的结构中。如果“amount”是条目数,那么不要把它放在结构中。同样,你不需要每个数字有一个
int
。相反,一个
unsigned int
就足够了。如果结构数组是全局的?
amount
不是全局变量,您需要一个初始化的
驱动程序
结构实例来访问它。我想关键是读取第一行并使用它来调整数组的大小,不要把它放在你的结构中。如果“amount”是条目数,那么不要把它放在结构中。同样,你不需要每个数字有一个
int
。相反,一个
无符号整数就足够了。这是不正确的。您必须为变量
totaldrivers
创建内存,而不是类型
drivers
。很好。纯粹的手指检查和草率的校对。固定的。谢谢,这是不对的。您必须为变量
totaldrivers
创建内存,而不是类型
drivers
。很好。纯粹的手指检查和草率的校对。固定的。谢谢。这个好像有用。当我完成代码的其余部分后,将很快更新。@RoafBeast Good luck.code非常有用,但我还有一个问题。我被告知我需要使用函数,而不仅仅是一个主函数。如何在函数中传递此数组?尽管此答案正确,但我无法确定如何在函数中传递数组。问我的伙伴们,我找到了一种更适合我的方法。无论如何谢谢你!如果你需要更多的帮助,问另一个问题。祝你好运,这个好像有用。当我完成代码的其余部分后,将很快更新。@RoafBeast Good luck.code非常有用,但我还有一个问题。我被告知我需要使用函数,而不仅仅是一个主函数。我如何在函数中传递这个数组?尽管这个答案是正确的,我还是不知道如何传递