Невозможно распечатать значения динамического c 2D массива структур - PullRequest
0 голосов
/ 13 марта 2020

Предполагается, что эта программа запросит у пользователя два значения, а затем сгенерирует и распечатает таблицу, используя эти два значения в качестве числа строк и столбцов соответственно. Каждая ячейка таблицы имеет два значения, обозначенных как cellX и cellY. Значения x и y каждой ячейки таблицы равны 1 и 2 соответственно.

Короче говоря, это динамический c 2D массив структур. Проблема в том, что программа, похоже, пропускает последнюю для l oop, поэтому она не печатает содержимое массива структур. Ошибок не было.

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

typedef struct          // one cell of a table holding two int values
{
    int *cellX;
    int *cellY;
} Table;

int main()
{
    char dump;
    int row, col, y, x;

    printf("Enter number of rows and columns (r,c): ");
    scanf("%d%c%d", &row, &dump, &col);

    Table **grid;
    grid = (Table **)malloc(row * col * sizeof(Table));

    for (y = 0; y < row; y++)           // assigns values to the table
    {
        for (x = 0; x < col; x++)
        {
            *grid[x][y].cellX = 1;      // all x-values will be 1
            *grid[x][y].cellY = 2;      // all y-values will be 2
        }
    }

    for (y = 0; y < row; y++)           // displays the table
    {
        for (x = 0; x < col; x++)
        {
            printf("%d, %d\t", *grid[x][y].cellX, *grid[x][y].cellY);
        }
    }

    free(grid);

    return 0;
}

1 Ответ

2 голосов
/ 13 марта 2020
grid = (Table **)malloc(row * col * sizeof(Table));

Это не то, как вы выделяете двумерный массив, Table** - это массив указателей (Table*) на массив Table, поэтому вы должны выделить все эти отдельные подмассивы.

Table **grid = malloc(sizeof(*grid) * row);
for (int y = 0; y < row; ++y)
    grid[y] = malloc(sizeof(*grid[0]) * col);

И затем не забудьте также освободить все эти массивы.

Во многих случаях это на самом деле не требуется, поэтому вы можете создать одномерный массив и затем индексировать это как-будто 2D. Например, с array[y * width + x].

Table *grid = malloc(sizeof(*grid) * row * col);
for (y = 0; y < row; y++)           // assigns values to the table
{
    for (x = 0; x < col; x++)
    {
        grid[y * col + x].cellX = 1;      // all x-values will be 1
        grid[y * col + x].cellY = 2;      // all y-values will be 2
    }
}

Также ваша структура содержит указатели, но я не понимаю, почему, и вы никогда не выделяли их. Просто сохраняйте значения.

typedef struct
{
    int cellX;
    int cellY;
} Table;
...