如何在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;
我正在尝试用 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;