【问题标题】:using malloc for block of structs将 malloc 用于结构块
【发布时间】:2011-03-07 14:47:11
【问题描述】:

我正在尝试分配一块内存,并存储一个结构列表,而不为每个结构使用多个 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;
} 

【问题讨论】:

    标签: c arrays list linked-list malloc


    【解决方案1】:

    问题出在这一行:

    tmp = tmp + sizeof(POINT);
    

    应该是

    ++tmp;
    

    后者表示将指针增加一个元素;因为它指向结构,所以它按结构的大小递增。原始代码改为增加 n 个元素,其中 n 是结构中的字节数。例如,如果 int 是 32 位,它将前进 8 个元素。

    【讨论】:

      【解决方案2】:

      这是错误的:

      mypoints = mypoints + sizeof(POINT); 
      

      你应该复习一下 C 中的指针算法。只需使用:

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

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

      这是一个参考:

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

      【讨论】:

      • 谢谢,我正在尝试这样做,或者人们真的使用它吗?我不想使用简单的链表来避免维护列表。我知道大多数时候我只会使用少量元素......比如说 10 个,但如果我需要更多空间,我会再分配 10 个等等......
      • 不,不是特别糟糕。不要小心你的指针算法!
      【解决方案3】:

      这就是为什么我会这样做

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

      【讨论】:

        【解决方案4】:

        在 C 中,将整数添加到 POINT* 指针不会使指针前进该字节数,而是该 POINT 结构数。

        您的代码中有两个地方可以将sizeof(POINT) 添加到您的指针。相反,您应该只添加 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 2013-01-23
          • 1970-01-01
          • 2013-12-31
          • 1970-01-01
          • 2018-06-21
          相关资源
          最近更新 更多