I'm trying to write a function that takes in position data, an array and a counter that stores number of elements in that array and populates that array with new position data and increments the counter. And since I need this array outside of the function, I'm dynamically allocating memory using realloc
.
Code
I have a struct
to store co-ordinate data
typedef struct CoOrdinates
{
int x;
int y;
} CoOrdinates;
and a function that draws a box at any given position
void drawBox(WINDOW* inWindow,
int aAtPositionX,
int aAtPositionY,
int* aOccupiedCoordinateCount,
CoOrdinates** aOccupiedCoordinates)
{
int newCount = (*aOccupiedCoordinateCount) + 1;
size_t sizeResized = sizeof(**aOccupiedCoordinates) * newCount;
*aOccupiedCoordinates = realloc(*aOccupiedCoordinates, sizeResized);
if (*aOccupiedCoordinates == NULL)
{
fprintf(stderr, "Failed to allocate CoOrdinate array at %d in %s.", __LINE__, __FILE__);
exit(-1);
}
else
{
(*aOccupiedCoordinates)[newCount].x = aAtPositionX;
(*aOccupiedCoordinates)[newCount].y = aAtPositionY;
*aOccupiedCoordinateCount = newCount;
mvwprintw(inWindow, aAtPositionY, aAtPositionX, "██");
}
}
where mvwprintw
and WINDOW*
are defined in ncurses
.
Another function is drawTwoVerticleBoxes
defined like this
void drawTwoVerticleBoxes(WINDOW* inWindow,
int aAtPositionX,
int aAtPositionY,
int* aOccupiedCoordinateCount,
CoOrdinates** aOccupiedCoordinates)
{
drawBox(inWindow, aAtPositionX, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
drawBox(inWindow, aAtPositionX, aAtPositionY + 1, aOccupiedCoordinateCount, aOccupiedCoordinates);
}
and a function called drawWithColor
void drawWithColor(WINDOW* inWindow,
int aAtPositionX,
int aAtPositionY,
int* aOccupiedCoordinateCount,
CoOrdinates** aOccupiedCoordinates)
{
init_pair(1, COLOR_GREEN, COLOR_BLACK);
wattron(inWindow, COLOR_PAIR(1));
drawTwoVerticleBoxes(
inWindow, aAtPositionX, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
wattroff(inWindow, COLOR_PAIR(1));
Finally all of those are called in renderRoutine
void renderRoutine()
{
...
...
int occupiedCoordinateCount = 0;
CoOrdinates* occupiedCoordinates = NULL;
drawWithColor(windowPointer, 4, 4, &occupiedCoordinateCount, &occupiedCoordinates);
wgetch(windowPointer);
endwin();
for (int i = 0; i < occupiedCoordinateCount; ++i)
{
printf("X: %d, Y: %d \n", occupiedCoordinates[i].x, occupiedCoordinates[i].y);
free(occupiedCoordinates);
}
}
Summery
The idea is, every time a box is drawn, occupiedCoordinates
will store CoOrdinate
of that position. occupiedCoordinateCount
will store how many items occupiedCoordinates
have.
Errors
Expected results
X: 4, Y: 4
X: 4, Y: 5
Actual results
X: 0, Y: 0
X: 504864784, Y: 22033
free(): double free detected in tcache 2
Tweaks
If I define a function say drawFiveHorizontalBoxes
void drawThreeHorizontalBoxes(WINDOW* inWindow,
int aAtPositionX,
int aAtPositionY,
int* aOccupiedCoordinateCount,
CoOrdinates** aOccupiedCoordinates)
{
drawBox(inWindow, aAtPositionX, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
drawBox(inWindow, aAtPositionX + 1, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
drawBox(inWindow, aAtPositionX + 2, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
drawBox(inWindow, aAtPositionX + 3, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
drawBox(inWindow, aAtPositionX + 4, aAtPositionY, aOccupiedCoordinateCount, aOccupiedCoordinates);
}
Expected results
X: 4, Y: 4
X: 5, Y: 4
X: 6, Y: 4
X: 7, Y: 4
X: 8, Y: 4
Actual results
realloc(): Invalid next size
core dumped
Edit
(*aOccupiedCoordinates)[*aOccupiedCoordinateCount].x = aAtPositionX;
(*aOccupiedCoordinates)[*aOccupiedCoordinateCount].y = aAtPositionY;
or
(*aOccupiedCoordinates)[newCount - 1].x = aAtPositionX;
(*aOccupiedCoordinates)[newCount - 1].y = aAtPositionY;
shows
X: 4, Y: 4
X: -1300275184, Y: 21961
free(): double free detected in tcache 2
in drawThreeHorizontalBoxes
.