используя malloc для блока структур - PullRequest
2 голосов
/ 24 июня 2010

Я пытаюсь выделить блок памяти и сохранить список структур без использования нескольких malloc для каждого ... это просто общий пример, у меня нет исходного кода, с которым я работал ранее, ноэто общая идея, но моя проблема заключалась в том, что я получал повреждение кучи, когда другие части моего кода выполнялись после вызова функции InitPoints ().Я не знаю, какая часть моего кода недопустима, но я подозреваю, что она находится в цикле for функции InitPoints ().Я пытаюсь использовать это как таблицу, затем я могу создать дополнительные таблицы определенного размера, если мне не хватит памяти, и связать их вместе ... что-то вроде массива с динамическим расширением, если это имеет смысл.

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 ]

3 голосов
/ 24 июня 2010

Это неправильно:

mypoints = mypoints + sizeof(POINT); 

Вы должны просмотреть арифметику указателя в C. Просто используйте:

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

(в вашей функции InitPoints есть похожая проблема)

Вот одна ссылка:

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

3 голосов
/ 24 июня 2010

Проблема в этой строке:

tmp = tmp + sizeof(POINT);

Это должно быть

++tmp;

Последний говорит, чтобы увеличить указатель на один элемент;поскольку он указывает на структуру, он увеличивается на размер структуры.Вместо этого исходный код увеличивается на n элементов, где n - количество байтов в структуре.Например, если int 32-битный, он будет расширен на 8 элементов.

1 голос
/ 24 июня 2010

Вот почему я бы это сделал

for (i = 0; i < size; i++)
{
    orig[i].x = a++;
    orig[i].y = b++;
}
0 голосов
/ 24 июня 2010

В C добавление целого числа к указателю POINT * увеличивает указатель не на это количество байтов, а на это количество структур POINT.

В вашем коде есть два места, куда вы добавляете sizeof(POINT) к указателю. Вместо этого вы должны просто добавить 1.

...