c - realloc数组的下一个大小无效



你好,当使用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; 
}
}

在语句中,您至少需要像

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;

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

哦,这有点吓人。我不明白你为什么不提前分配足够的空间。但是这段代码将会被realloc 100,000次,这是一件疯狂的事情。你知道realloc是做什么的吗?我将解释。

首先,它对数据量进行NEW分配。第一次循环时,numberOfElements是0,你使用malloc'd空格。但是第二次它为2个整数分配空间,然后是3个整数,然后是4,等等。

所以它分配8个字节。它记住上次分配了多少(4个字节——在大多数系统上是int型的大小),然后对这个大小的空间执行内存。

则内存为8字节。然后内存是12字节,以此类推。

坏,坏,坏。

大多数人所做的是跟踪两个值——分配的空间量(capacity)和使用的空间量(count或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。

相关内容