动态扩展结构C

时间:2017-10-01 05:30:56

标签: c arrays pointers struct

因此,对于我的学校项目,将通过stdin输入一个大型CSV文件,我们必须根据列对其进行排序,并将其打印为已排序的csv文件。

我现在所采取的步骤是弄清楚如何保留realloc struct个数组,以便在数据不足以容纳来自{{{{1}的数据时它会增长1}}。我们不知道将在CSV文件中输入的确切行数。现在我们只使用静态金额来测试并查看值是否已分配给stdin

我仍然是C的初学者,所以我不清楚我是如何迭代指针的,就像我会迭代一个数组一样。由于我们在数组中使用静态数量的struct s,我们可以像在Java中一样使用struct进行迭代,但是如何迭代array[i]之类的东西呢?

我不知道从哪里开始创建这个动态数组。我试过了

*array

但是我不知道如何使用struct array* testArray = (array*)malloc(sizeof(testArray)); 像使用静态数组那样迭代它。

非常感谢任何帮助,对不起文字之墙......

2 个答案:

答案 0 :(得分:0)

struct array* testArray = (array*)malloc(sizeof(testArray));

有点不对,因为你只分配了1个testArray元素。

更像是:

struct A
{
    int a;
    int b;
    ....
};

struct A* arr = malloc( N * sizeof(struct A) );
                       ^^^
                       N element of struct A

int j;
for (j=0; j<N; ++j)  // Iterate it like any other array
{
    arr[j].a = 5;
    arr[j].b = 42;
    ....
}

当您需要增加阵列时使用realloc

从文件/标准输入读取时,它可能看起来像(基于David C. Rankin的评论):

int n=0; // Count of the number of structs read from the file

struct A* arr = malloc( N * sizeof(struct A) );
while (read line from file)
{
    arr[n].a = val1; 
    arr[n].b = val2; 
    ++n;              // Increment count
    if (n == N)       // Check if current array is full, i.e. realloc needed
    { 
       // realloc array to 2 * N; N = N * 2 
    }
}

答案 1 :(得分:0)

您可以像使用数组一样浏览malloced空间(使用标记),但似乎您的主要问题在于使用malloc。 Malloc的参数是您要分配的 bytes 的数量。因此,如果你想拥有一个结构数组,首先需要找出一个结构包含sizeof(struct array)所包含的字节数,然后确定你想要多大的数组,比方说N。因此,该代码行应该更像struct array* testArray = malloc(N * sizeof(struct array));。 malloc的返回值将是一个void指针,其中包含已分配空间的第一个字节的内存地址。将此值分配给testArray后,它将被类型转换为指定的变量类型(struct array *)。现在,您可以使用指针算法来访问具有i的特定索引*(testArray + i),或者只使用testArray [i]。如果您发现N的大小不够,可以使用realloc将数组大小增加到2N,或者认为必要的大小。