如何在C中为未知大小的结构数组分配内存

how to allocate memory for unknown size struct array in C

我正在尝试用 C 读取一个大的 ticks 文件并每秒为它们保存一个结构。每一秒,我都会在这个结构中有不同的代码。但是,如果在某一秒内我们看到过多的自动收报机,我的代码就会崩溃。

例如,

第1秒,只有10个代码。 在秒 1000 中,它看到 10000。

我的代码将为每一秒分配相同大小的内存,因此它在安静的那一秒浪费了太多内存,但在繁忙的那一秒却浪费了太多内存。

请在下面找到我的添加结构代码,

long int addTickArray(long int TickTime, int maximumOrderSize, struct TickArray*TickArray, long int TickPos) {

        int i;

        for (i = TickPos; i < maximumOrderSize; i++) {

            if (TickArray[i].TickTime == NULL) {

                break;

            } else if (TickArray[i].TickTime == TickTime) {

                return i;

            }

        }

        struct TickArray newTickArray;


        newTickArray.Ticker = malloc(4000 * sizeof (char*) *10);
        newTickArray.askprice = malloc(4000 * sizeof (float*));
        newTickArray.bidprice = malloc(4000 * sizeof (float*));

        newTickArray.TickTime = TickTime;

        newTickArray.TickTimePos = 0;

        TickArray[i] = newTickArray;

        return(i);
    }

我不确定是否有任何聪明的方法可以为结构分配灵活的内存。

使用realloc在初始块已满时分配更多内存。

struct TickArray {
    size_t maxSize;
    size_t currSize;
    // Declaration of ticker, askprice, bidprice
};

currSize达到maxSize时:

maxSize = maxSize * 2;
tickData.ticker = realloc(tickData.tickarray, maxSize * ...

我认为您的代码中存在设计问题:出于某种原因,您在两个不同的函数中读取数据(问题中未包含代码)并为该数据(addTickArray 函数)分配内存。这会导致资源浪费并引入额外的故障条件。

您应该做的是创建一个函数来同时执行这两项操作 - 读取文件和为新数据分配内存。例如,您可以暂时将新的报价单读入一个足够大的数组以应对最坏的情况,检查数据的实际大小并分配一个新的 TickArray 确切需要大小的元素。

您可以创建并使用列表结构来解决您的问题。列表结构允许你每次添加新元素时分配一个元素。

或者您可以使用双倍大小调整机制来调整数组大小。您必须使用两个变量:一个用于存储当前大小,一个用于存储数组的最大大小。当当前大小大于最大大小时,您使用 "realloc" 函数重新分配您的数组,新大小为当前最大大小的两倍

例如:

if (currentSize+1 > maxSize)
{
    maxSize *= 2;
    T* newArray = (T*) realloc (currentArray, maxSize * sizeof(T));
}

currentArray[currentSize++] = newElement;