2016-07-28 73 views
-1

我正在嘗試使用realloc實現dinamically增加的數組。我創建malloc的數組,然後叫我add功能,1。此處增加數組的大小是代碼:realloc bug - 增加數組的最後一個元素

#include <stdio.h> 
#include <stdlib.h> 

int *foo; 
int quantity; 

void add(int number) { 
    foo = (int*) realloc(foo, sizeof(foo) + sizeof(int)); 
    foo[quantity] = number; 
    quantity++; 
} 

void debugFoo() { 
    for (int i = 0; i < quantity; i++) { 
     printf("foo[%i] = %i\n", i, foo[i]); 
    } 
    printf("\n"); 
} 

int main() { 
    quantity = 3; 
    foo = (int*) malloc(quantity * sizeof(int)); 

    foo[0] = 1; 
    foo[1] = 2; 
    foo[2] = 3; 

    debugFoo(); 

    add(20); 
    debugFoo(); 
    add(2); 
    debugFoo(); 

    return 0; 
} 

然而,當我運行它,我得到以下的輸出:

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 20 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 21 
foo[4] = 2 

正如您所看到的,第二次調用add時,foo [3]的值會加1。而奇怪的是,只有當傳遞給add的第一個值是偶數時纔會增加。更改第30行至add(21),我得到下面的輸出:

[...] 
foo[2] = 3 
foo[3] = 21 

foo[0] = 1 
foo[1] = 2 
foo[2] = 3 
foo[3] = 21 
foo[4] = 2 

這是一個bug,或我使用realloc錯了嗎?

+0

您不需要投射malloc結果。你可以改變'foo =(int *)malloc(quantity * sizeof(int));'to'foo = malloc(quantity * sizeof * foo);' – sjsam

+0

[Compiler Bug](http://c2.com/cgi/wiki?CompilerBug) –

回答

5

sizeof(foo)不是分配的緩衝區的大小,但的foo的大小,這是int*。使用保存的元素數來計算新的緩衝區大小。

foo = (int*) realloc(foo, sizeof(int) * (quantity + 1)); 
+0

[相同想法](http://ideone.com/8VwKoX) – imbearr

1

sizeof(foo)總是返回你同樣的價值,大概4。由於sizeof操作符將返回你的int *

大小你有「正確地」宣佈全球範圍內變量(quantity)存儲電流的大小你的數組,使用該變量到realloc你的結構,就像你用malloc做的那樣。

void add(int number) { 
    quantity++; 
    foo = realloc(foo, (quantity * sizeof(int))); 
    if (foo != NULL) 
    { 
     foo[quantity-1] = number; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to add number.\n"); 
    } 
} 

請注意,始終檢查函數返回值非常重要。 正如realloc返回值的示例所示,您必須對mallocmain函數執行相同的操作。

int main() { 
    quantity = 3; 
    foo = malloc(quantity * sizeof(int)); 
    if (foo != NULL) 
    { 
     foo[0] = 1; 
     foo[1] = 2; 
     foo[2] = 3; 

     debugFoo(); 

     add(20); 
     debugFoo(); 
     add(2); 
     debugFoo(); 

     return 0; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to allocate array.\n"); 
     return 1; 
    } 
} 
+0

此代碼包含錯誤。 - 它似乎是固定的。 – MikeCAT

+0

所以downvoter,我正在編輯。可以讓我呼吸....? – LPs

+0

@MikeCAT我嚴重按下「發佈您的答案」按鈕... :) – LPs