繁体   English   中英

如何在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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM