使用malloc作为结构块

时间:2010-06-24 02:18:03

标签: c arrays list linked-list malloc

我正在尝试分配一块内存,并存储一个结构列表而不为每个使用多个malloc ...这只是一个通用示例,我没有我之前使用的原始代码,但是这是一般的想法,但我的问题是,当我的代码的其他部分在InitPoints()函数调用之后执行时,我正在获得堆损坏。我不知道我的代码的哪一部分是非法的,但我怀疑它是在InitPoints()函数的for循环中。我试图将它用作表,然后我可以创建额外的定义大小的表,如果我的内存不足并将它们链接在一起......所以有点像动态扩展数组,如果这是有道理的。

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;
} 

4 个答案:

答案 0 :(得分:3)

问题出在这一行:

tmp = tmp + sizeof(POINT);

应该是

++tmp;

后者说要将指针递增一个元素;因为它指向结构,它增加了结构的大小。原始代码由 n 元素递增,其中 n 是结构中的字节数。例如,如果int是32位,则它将提前8个元素。

答案 1 :(得分:3)

这是错误的:

mypoints = mypoints + sizeof(POINT); 

您应该在C中查看指针算术。只需使用:

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

(您的InitPoints函数存在类似问题)

这是一个参考:

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

答案 2 :(得分:1)

这就是为什么我会这样做

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

答案 3 :(得分:0)

在C中,向POINT *指针添加一个整数会使指针前进不是这个字节数,而是前进那个POINT结构数。

您的代码中有两个位置,用于向指针添加sizeof(POINT)。相反,你应该加1。