У меня есть массив структур n размера, динамически размещаемых, и каждая позиция массива также является массивом, с разными размерами для каждой позиции (массивом массивов).
Я создал функцию для удаления заданного массива [index], но я столкнулся с некоторым неопределенным поведением, например:
Если массив имеет размер 3, если я удаляю массив [0], я не могу получить доступ к массиву [1]. Это происходит и с другими комбинациями индексов. Единственный способ, которым это работает безупречно, - это когда я удаляю от начала до конца.
Вот код, который у меня есть:
Структуры:
typedef struct point{
char id[5];
char type[5];
char color[10];
int x;
int y;
} Point;
typedef struct {
char lineID[5];
int nPoints;
Point *pt;
}railData;
typedef struct railway {
railData data;
}railway;
Вот как был создан массив:
headRail = (railway**)calloc(lineNum,sizeof(railway*));
И каждый рельс:
headRail [i] = (Railway *) Calloc (pointsNum, sizeof (Railway));
Это функции для удаления рельса:
railway **delRail(railway **headRail, int j)
{
int nPts = 0;
if (!headRail)
{
puts(ERRORS[NULLPOINTER]);
return NULL;
}
// Number of rail points on jth rail
nPts = headRail[j]->data.nPoints;
// Free each rail point from jth rail
for (int i = 0; i < nPts; ++i)
{
free(headRail[j][i].data.pt);
}
// Free allocated memory for jth rail
free(headRail[j]);
return headRail;
}
И вот где я вызываю предыдущую функцию:
railway **removeRail(railway **headRail)
{
char userID[20];
int index = 0;
// Quit if no rails
if (!headRail)
{
backToMenu("No rails available!");
return NULL;
}
// Get user input
getString("\nRail ID: ",userID,MINLEN,MAXLEN); // MINLEN = 2 MAXLEN = 4
// get index of the asked rail
getRailIndex(headRail,userID,&index);
if (index != NOTFOUND)
{
headRail = delRail(headRail, index);
// Update number of rails in the array (global var)
NUMOFRAILS--;
backToMenu("Rail deleted!\n");
}
else
backToMenu("Rail not found!");
return headRail;
}
Поэтому мой вопрос заключается в том, как я могу изменить свой код так, чтобы при удалении позиции i все другие индексы сдвигались влево, а последняя позиция, которая была бы пустой, отбрасывалась (что-то вроде realloc, но для сокращения)
Можно ли выполнить то, что я спрашиваю, без изменения структуры массива?