2014-04-16 106 views
3
typedef struct { 
    int count; 
    int *items; 
}set; 

set* set_alloc(set *src, int num); 
int set_insert(set *s, int num); 

int main() { 
    set *A = NULL; 
    A = set_alloc(A, 0); 
    A = set_alloc(A, 1); //this and line below is part of inserting function 
    A->items[0] = 2; 
    system("pause"); 
} 

set* set_alloc(set *src, int num) { 
    if (src == NULL && num == 0) { 
      set *src = (set*)malloc(sizeof(set)); 
     src->count = 0; 
     src->items = NULL; 
    } 
    else { 
     src->count = num; 
     src->items = (int*)realloc(src->items, num*sizeof(int)); 
    } 
    return src; 
} 

代碼陣列能夠針對該組內和對於該組本身項目陣列分配內存,然而,它未能realloc的項目的該陣列..我可以設置它的恆定大小,但我並不想繞過這個問題,因爲我已經在以前的項目中使用過它。重新分配內部結構上面

+2

目前還不清楚'realloc''失敗'在這裏。請準確描述發生了什麼。 – SirDarius

+2

[不要在C]中輸入'malloc'(和family)的結果(http://stackoverflow.com/a/605858/440558)。 –

+0

另外,請注意不要將'realloc'的結果返回給您正在重新分配的指針。如果'realloc'失敗並返回'NULL'會怎麼樣?然後你鬆開原來的指針並且會有內存泄漏。 –

回答

3

這裏:

set *src = (set*)malloc(sizeof(set)); 

你重新聲明src(在一個塊範圍內),你想:

src = malloc(sizeof(set)); 

我可以將它設置一定的大小,但我真的不想要繞過 這個問題,因爲我已經在以前的項目中使用過它。

當您事先不知道大小時,替代realloc是一個鏈接列表。

2

函數永遠不會從函數set_alloc返回新分配的「* src」,請參閱下面的註釋,請使用相同的* src進行分配,並且您的代碼應該可以工作。

set* set_alloc(set *src, int num) { 
    if (src == NULL && num == 0) { 
     set *src = (set*)malloc(sizeof(set)); ***//<--- This pointer is local to if block.*** 
*//Please Correct code as =>*   src = (set*)malloc(sizeof(set)); 

     src->count = 0; 
     src->items = NULL; 
    } 
    else { 
     src->count = num; 
     src->items = (int*)realloc(src->items, num*sizeof(int)); 
    } 
    return src; ***// <-- This is returning the in parameter not the malloced pointer *** 
} 
+0

是的。該函數最初創建了一個新集,分配了內存並將其返回,但我錯誤地升級了它,因此它也可以重新分配。謝謝 – Poody