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

时间:2015-11-26 09:02:05

标签: c arrays memory struct out-of-memory

我正在尝试在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);
    }

我不确定是否有任何智能方法为结构分配灵活的内存。

3 个答案:

答案 0 :(得分:0)

使用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 * ...

答案 1 :(得分:0)

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

你应该做的是创建一个同时执行这两个功能的单个函数 - 读取文件并为新数据分配内存。例如,您可以暂时将新的刻度读入一个足够大的数组,以应对最坏的情况,检查数据的实际大小并分配一个精确所需大小的新TickArray元素。

答案 2 :(得分:0)

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

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

前:

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

currentArray[currentSize++] = newElement;