【问题标题】:how to allocate memory for unknown size struct array in C如何在C中为未知大小的结构数组分配内存
【发布时间】:2016-02-29 07:03:09
【问题描述】:

我正在尝试在 C 中读取一个大刻度文件,并为它们每秒保存一个结构。每一秒,我都会在这个结构中拥有不同的代码。但是,如果在某一秒内我们看到太多的代码量,我的代码将会崩溃。

例如,

在第二个 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);
    }

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

【问题讨论】:

  • 你不能在每个时间间隔内只处理一个限制,并将剩余的推迟到下一个周期吗?
  • 不确定这里到底发生了什么,但为什么不为要存储的数据分配适当的内存量
  • 您可以将接收到的输入保存到动态分配的链表中,对项目进行计数,分配您的 tickarray 元素,将收到的项目复制到结构中并取消分配链表。或者...无论如何,要解决这个问题,您需要一个中间数据结构。
  • 另外,您的程序是否足够快,可以在 1 秒内处理 10000 个条目?如果没有,那么您的规范很可能存在根本缺陷
  • 问题不清楚。如果您正在阅读 "big ticks file",那么您应该能够计算您正在阅读的内容并将其分配(或传递所需的大小)给您的函数,以便为大批。无论如何,要获得更详细的帮助,您需要发布最低完整可验证示例(请参阅:How to create a Minimal, Complete, and Verifiable example

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


【解决方案1】:

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

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

例如:

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

currentArray[currentSize++] = newElement;

【讨论】:

    【解决方案2】:

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

    你应该做的是创建一个函数,它可以同时读取文件并为新数据分配内存。例如,您可以临时将新的报价读入一个足够大的数组以应对最坏的情况,检查数据的实际大小并分配一个新的TickArray 元素,该元素具有所需的确切大小。

    【讨论】:

      【解决方案3】:

      当初始块被填满时,使用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 * ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 2018-11-03
        • 2021-06-04
        • 2022-01-04
        • 2020-02-03
        • 1970-01-01
        相关资源
        最近更新 更多