【问题标题】:realloc invalid next size for arrayrealloc 数组的下一个大小无效
【发布时间】:2021-12-11 03:33:54
【问题描述】:

您好,当我使用 realloc 为数组分配更多内存时,下一个大小一直无效,我也尝试添加 100,000 个数字。我不知道为什么,因为我不明白为什么它不起作用。我的代码在下面。

int main() 
{
    printf("starting");
    int i;
    int *bubbleSortArray = (int *)malloc(sizeof(int));
    int numberOfElements = 0;
    int randomNumber;
    srand(time(NULL));
    int j;
    for (int j = 0; j <= 100000; j = j +1)
    {
        randomNumber = rand();
        if(numberOfElements != 0)
        {
            bubbleSortArray = (int *) realloc(bubbleSortArray, numberOfElements * sizeof(int));
        }
        bubbleSortArray[numberOfElements] = randomNumber;
        numberOfElements = numberOfElements + 1; 
    }

}

【问题讨论】:

  • 我很抱歉
  • 你在数组外写。分配numberOfElements元素时,最大索引为numberOfElements - 1

标签: c for-loop dynamic-memory-allocation realloc


【解决方案1】:

在语句中你至少需要写like

bubbleSortArray = (int *) realloc(bubbleSortArray, ( numberOfElements + 1 )* sizeof(int));

否则这个说法

bubbleSortArray[numberOfElements] = randomNumber;

调用未定义的行为。

另外你需要使用一个中间指针来存储realloc调用的返回值,因为函数可以返回一个空指针。在这种情况下,存储在指针bubbleSortArray 中的先前值将丢失,您将无法访问已分配的内存。

这样写会更好

int *tmp = (int *) realloc(bubbleSortArray, ( numberOfElements + 1 )* sizeof(int));

if ( tmp != NULL )
{
    bubbleSortArray = tmp;
}
else
{
    // some other code
}  

注意这些声明

int i;
int j;

是多余的,因为声明的变量没有被使用。

【讨论】:

  • 嗯,让我试试这个然后回复你
  • 谢谢它的工作
【解决方案2】:

哦,这有点吓人。我不确定你为什么没有预先分配足够的空间。但是这段代码将重新分配 100,000 次,这是一件很疯狂的事情。你知道 realloc 在底层做了什么吗?我会解释的。

首先,它对数据量进行新分配。因此,第一次循环时,numberOfElements 为零,并且您使用 malloc 的空间。但是第二次它为 2 个整数分配空间,然后是 3 个整数,然后是 4 个,等等。

所以它分配了 8 个字节。它会记住上次分配了多少(4 字节——在大多数系统上是一个 int 的大小),然后它对那么多空间进行 memcpy。

然后是 memcpy 的 8 个字节。然后是 memcpy 的 12 个字节,以此类推。

糟糕,糟糕,糟糕。

大多数人所做的是跟踪两个值 - 分配的空间量(容量)和使用量(计数或 numberOfElements)。

所以它看起来像这样:

int capacity = 16;
int *bubbleSortArray = (int *)malloc(capacity * sizeof(int));
...
if (numberOfElements >= capacity) {
     // Increase capacity by whatever means you want.
     // You can double it. Or you can:
     capacity += 16;
     bubbleSortArray = (int *) realloc(bubbleSortArray, capacity * sizeof(int));
}

啊,当我剪切并粘贴您的代码时,我看到您使用了 numberOfElements。因此,无论如何,您一直将 realloc 的大小减少 1。

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2014-10-13
    • 2015-01-22
    • 1970-01-01
    • 2016-03-19
    • 2011-02-25
    相关资源
    最近更新 更多