您好,當我使用 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;
}
}
uj5u.com熱心網友回復:
在宣告中,您至少需要這樣寫
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;
是多余的,因為未使用宣告的變數。
uj5u.com熱心網友回復:
哦,這有點可怕。我不確定您為什么沒有預先分配足夠的空間。但是這段代碼將重新分配 100,000 次,這是一件很瘋狂的事情。你知道 realloc 在幕后做了什么嗎?我來解釋一下。
首先,它對資料量進行新分配。因此,第一次回圈時,numberOfElements 為零,并且您使用了 malloc 空間。但是第二次它為 2 個整數分配空間,然后是 3 個整數,然后是 4,等等。
所以它分配了8個位元組。它記住上次分配了多少空間(4 個位元組——大多數系統上 int 的大小),然后它會執行一個 memcpy 的這么多空間。
然后它是 memcpy 的 8 個位元組。然后它是 memcpy 的 12 個位元組,依此類推。
壞,壞,壞。
大多數人所做的是跟蹤兩個值——分配的空間量(容量)和使用量(計數或元素數)。
所以它看起來像這樣:
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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339567.html
