использование malloc для блока структур

Я пытаюсь выделить блок памяти и сохранить список структур без использования нескольких mallocs для каждого … это всего лишь общий пример, у меня нет исходного кода, с которым я работал ранее, но это общая идея, но моя проблема заключалась в том, что я получал повреждение кучи, когда другие части моего кода выполнялись после вызова функции 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 x, mypoints->y); mypoints = mypoints + sizeof(POINT); } // some other code... // ie 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 x = a++; tmp->y = b++; tmp = tmp + sizeof(POINT); } return orig; } 

Это не верно:

 mypoints = mypoints + sizeof(POINT); 

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

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

(Аналогичная проблема наблюдается в вашей функции InitPoints)

Вот один рефери:

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

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

 tmp = tmp + sizeof(POINT); 

Так должно быть

 ++tmp; 

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

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

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

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

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