2015-10-05 82 views
0

我有一個問題,自我參照構造調用的realloc。當我運行這個程序時,我得到錯誤*** Error in ...: realloc(): invalid next size: 0x0000000000602160 ***。我想這個問題與最後一行有關,因爲如果我評論它,程序運行沒有任何問題。Ç - 自引用的結構和realloc

這是代碼最小的(不)工作片:

#include <string.h> 
#include <stdlib.h> 

typedef struct structure { 
    int connections; 
    struct structure *links; 
} structure; 

int main(int argc, char *argv[]) { 
    int struct_count; 
    int i, from, to, offset; 
    structure *structs; 

    struct_count = 2; 

    structs = malloc(sizeof(structure) * struct_count); 
    memset(structs, 0, sizeof(structure) * struct_count); 
    for(i = 0; i < struct_count; i++) { 
     structs[i].links = malloc(1); 
     structs[i].connections = 0; 
    } 

    for(i = 0; i < 100; i++) { 
     from = 0; 
     to = 1; 

     offset = structs[from].connections++; 
     structs[from].links = realloc(structs[from].links, sizeof(int) * (offset + 1)); 
     structs[from].links[offset] = structs[to]; // This is the problematic line - why? 
    } 
} 

我的問題:什麼是錯的代碼?

+2

'的malloc(1)'是不夠的的指針,這個'結構[從] .links = realloc的(結構[從] .links,的sizeof(int)的*(偏移+ 1));'是危險的, 'realloc()'可能返回NULL,並且先前的poitner將會消失,從而導致內存泄漏。 –

+1

爲什麼''realloc'中的sizeof(int)'?更改爲'sizeof(structure)' –

+1

「下一個大小無效」不可避免地指出在解除分配或重新分配之前發生的一些錯誤。運行valgrind查看問題發生的位置。 – dasblinkenlight

回答

3

的問題是你第一次分配,它是不夠的。要分配給定類型的n元素可以使用

structs[i].links = malloc(n * sizeof(*structs[i].links)); 

和同樣機智realloc()你還需要確保realloc()沒有返回NULL,假設對於n結構與線以上分配空間後要調整存儲n + 1實例,然後

struct structure *links; 
links = realloc(structs[i].links, (n + 1) * sizeof(*links)); 
if (links == NULL) 
{ 
    /* Depending on the way your program is designed */ 
    probably_free_links(&structs[i].links); 
    /*    ^make it `NULL' inside */ 
    allocation_failure_do_something_about_it_but_do_not_continue(); 
} 
structs[i].links = links; 

可以使structs[i].links = NULL;最初和realloc()將表現爲malloc()第一次。

寫你的程序,就好像所有的錯誤都是可能的,並做一些他們不只是讓你的程序調用未定義的行爲,並使它成爲一個謎給你和你的程序的用戶。

+0

「*寫你的程序,就好像所有的錯誤都可能*」 :-) – alk

+0

謝謝您的回答。我沒有將NULL傳遞給'realloc()'的原因是我有錯誤(斷言失敗),但那是我的代碼中的另一個錯誤。關於錯誤處理:這只是我能夠編寫的有這個問題的最小的一段代碼。我從'malloc()'得到了有效的指針,程序在THIRD通過循環後崩潰了。 – Markaos

+2

這在解釋錯誤方面做得很好,但錯過了OP實際上做的事情不太可能是他想要做的。這個命名錶明,不是製作數組元素的多個副本,他希望在每一個元素中設置一個*指針*的動態數組。在那種情況下,'structure.links'的類型是錯誤的(應該是'struct structure **'),並且它的賦值也是錯誤的。 –

-1

如果你會增加結構的藍圖,並降低循環的規模將完美運行..

**例如: - **無操作運行程序只是降低了循環條件,從100到2它會完美運行。

如果你想增加環的大小,你必須增加結構的大小。