2010-06-24 76 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