Выделение памяти для динамического массива

Я пытаюсь добавить к массиву точек в ломанной линии lineString.points ещё одну точку point. Но, если ввести число больше 5, то при выделении доп. места в массиве элементы 4, 5 и 6 меняются. Объясните, пожалуйста, из-за чего это происходит и что нужно исправить.

#include <stdio.h>
#include <malloc.h>

struct Point {
    int x;
    int y;
} typedef Point;

struct LineString {
    Point *points;
    int pointsNumber;
} typedef LineString;

int main()
{
    Point point;
    LineString lineString;

    printf("Введите кол-во точек: ");
    scanf("%d", &lineString.pointsNumber);

    lineString.points = (Point*) malloc (lineString.pointsNumber * sizeof(Point));

    for (int i = 0; i < lineString.pointsNumber; i++) {
        lineString.points[i].x = i;
        lineString.points[i].y = i;
    }

    point.x = lineString.pointsNumber;
    point.y = lineString.pointsNumber;

    lineString.points = (Point*) realloc (lineString.points, sizeof(Point));
    lineString.points[lineString.pointsNumber] = point;
    lineString.pointsNumber++;

    for (int i = 0; i < lineString.pointsNumber; i++) {
        printf("Point %d = (%d, %d)\n", i + 1, lineString.points[i].x,
lineString.points[i].y);
    }

    return 0;
}

5 точек и меньше

6 точек и больше


Ответы (1 шт):

Автор решения: Harry

Собственно, а что вы хотите?

lineString.points = (Point*) realloc (lineString.points, sizeof(Point));

Здесь вы оставили в 'lineString.points' указатель на одну Point, все остальные вообще-то отброшены и могут быть перезаписаны. А то, что у вас это не влияет на вывод при вводе 5 — просто несчастливая случайность...

Хотите память увеличить?

lineString.points = (Point*) realloc(lineString.points,
                                     sizeof(Point)*(lineString.pointsNumber+1));

И, кстати, не забывайте проверить, что на самом деле возвращает функция — что malloc, что realloc. Мало ли..

И еще — в С приведение типа (Point*) не требуется.

→ Ссылка