Динамически распределяющий структурный вектор - PullRequest
0 голосов
/ 08 марта 2020

Я создал следующую структуру:

typedef struct move {
        char line;
        int column;
}move;

И хочу динамически выделить память для массива этой предыдущей структуры. Пока что у меня есть:

int main(){
        //Allocate memory for 1 move
        struct move *moves = malloc(sizeof(struct move));
        printf("Moves size: %ld\n", sizeof(moves));
        //Read first move
        scanf("%c%d", &moves->line, &moves->column);
        printf("Move 1 = %c%d\n", moves->line, moves->column);
        //Realloc moves so that struct vector can fit 2 moves now
        moves = (struct move*)realloc(moves, sizeof(moves) + sizeof(struct move));
        printf("Moves size after realloc: %ld\n", sizeof(moves));
        //Read second move
        scanf("%c%d", &(moves+1)->line, &(moves+1)->column);
        printf("Move 1 = %c%d\n", (moves+1)->line, (moves+1)->column);
        return 0;
}

С этим я могу прочитать первый ход, но не второй. Я думаю, что я не правильно делаю часть reallo c, но у меня также есть ощущение, что моя структура должна иметь своего рода указатель, который указывает на следующий ход.

Я видел здесь несколько похожих вопросов относительно похожих вопросы, но все структуры имели указатели внутри.

Есть мысли?

1 Ответ

0 голосов
/ 08 марта 2020

Смотри,

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
        char line;
        int column;
}move;

int main()
{
        char ch;

        move *moves = malloc(sizeof(move));
        if(!moves)
            exit(1);

        scanf("%c%d", &moves->line, &moves->column);
        printf("Move 1 = %c%d\n", moves->line, moves->column);

        moves = (move*)realloc(moves, sizeof(move)*2);
        if(!moves)
            exit(1);

       while((ch=getchar())!='\n'&&ch!=EOF);
       scanf("%c%d", &(moves+1)->line, &(moves+1)->column);
       printf("Move 1 = %c%d\n", (moves+1)->line, (moves+1)->column);
       return 0;
}

Это напечатает размер ходов (размер указателя), а не то, на что он указывает

      printf("Moves size: %ld\n", sizeof(moves));

Так что вы можете удалить это, если хотите поставить * перемещается, но печатает только размер одного «движения» (т.е. текущего указывающего движения), но не все «движения», на которые он указывает. проверить, действительно ли mallo c выделена память или нет

...