2010-06-24 82 views
2

我想分配一塊內存,並存儲結構的列表,而不使用多個malloc每個...這只是一個通用的例子,我沒有原始代碼I與之前的工作,但這是一般的想法,但我的問題是,當我的代碼的其他部分執行InitPoints()函數調用後,我得到堆腐敗。我不知道我的代碼的哪部分是非法的,但我懷疑它是在InitPoints()函數的for循環中。我試圖用這個表作爲表,然後如果我耗盡內存並將它們鏈接在一起,我可以創建額外的已定義大小的表......如果這樣做有道理,就像動態擴展數組一樣。使用malloc塊的結構

typedef struct Tb{ 
    POINT points; 
    POINT *next; 
} TABLE; 

typedef struct Pt{ 
    int x; 
    int y; 
}POINT; 

POINT *mypoints; 

int main() { 
    int size = 10; 
    int i = 0; 
    mypoints = InitPoints(size); 

    for(i=0; i < size; i++) 
    { 
     printf("mypoint [%d] = (%d,%d)\n",i, mypoints->x, mypoints->y); 
     mypoints = mypoints + sizeof(POINT); 
    } 
    // some other code... 
    // i.e. createThread(....) 

    return 0; 
} 

POINT* InitPoints(int size) 
{ 
    POINT *tmp; 
    POINT *orig; 
    int a = 10; 
    int b = 1000; 
    orig = (POINT*) malloc (sizeof(POINT) * size); 
    if(orig == NULL) 
     return NULL; 

    tmp = orig; 
    for (i = 0; i < size; i++) 
    { 
     tmp->x = a++; 
     tmp->y = b++; 
     tmp = tmp + sizeof(POINT); 
    } 
return orig; 
} 

回答

3

這是錯誤的:

mypoints = mypoints + sizeof(POINT); 

應該檢查指針運算在C.只需使用:

mypoints += 1; /* or something similar */ 

(有一個在你的InitPoints功能類似的問題)

這裏有一個引用:

http://www.eskimo.com/~scs/cclass/notes/sx10b.html

+0

謝謝,我試圖做到這一點裂縫,或人們實際上使用它?我不想使用簡單的鏈接列表來避免維護列表。我知道大多數時候我只會有少數元素與......一起工作,比如說10,但是如果我需要更多空間,我將只分配另外10個元素...... – emge 2010-06-24 02:26:37

+0

不,這不是特別糟糕。不要小心你的指針算術! – BobbyShaftoe 2010-06-24 04:42:10

3

的問題是在這條線:

tmp = tmp + sizeof(POINT); 

它應該是

++tmp; 

後者表示由一個元件遞增指針;因爲它指向的結構,它增加了結構的大小。原始代碼改爲n元素其中n是結構中的字節數。例如,如果int爲32位,則它將前進8個元素。

1

這就是爲什麼我會做

for (i = 0; i < size; i++) 
{ 
    orig[i].x = a++; 
    orig[i].y = b++; 
} 
0

在C中,添加到一個點的整數*指針由該字節數前進指針,而是由數POINT結構。

您的代碼中有兩個地方添加了0​​指針。相反,你應該只加1。

+0

謝謝...我認爲這將解決我的問題... – emge 2010-06-24 02:32:27