Размер вложенного 2d массива структур - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующие структуры, из которых ** место становится двумерным массивом постоянных посетителей. Я хочу проверить это перед тем, как посадить покровителя в кресло. В частности, если количество мест 2х2, и я хочу знать, как обнаружить легальную вставку и поймать ее за пределы;

theatre_seating *t;
t->seating[0][0]=some_patron; // how to know this is ok?

и тот

t->seating[3][4]=some_patron; // how to know this is not?

Структуры.

struct patron {
    char last_name[30];
    char first_name[30];
};
struct theatre_seating {
    struct patron **seating;
};

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

С чем вы сталкиваетесь - это распад массива , который означает потерю размера и размеров, когда массивы передаются или используются в качестве указателей.

Из проекта комитета C N1570:

6.3.2.1 L-значения, массивы и обозначения функций
...
За исключением случаев, когда он является операндом оператора sizeof, оператора _Alignof или унарного оператора &, или является строковым литералом, используемым для инициализации массива, выражение, имеющее тип '' массив типа '', преобразуется в выражение с типом '' указатель на тип '', которое указывает на начальный элемент объекта массива и не является lvalue.

Таким образом, в этом сценарии вам придется где-то хранить измерения и размер в каждом измерении, если вы хотите обнаружить доступ за пределами допустимого диапазона.

0 голосов
/ 06 сентября 2018

C-указатели не имеют встроенных средств для отслеживания размера того, на что они указывают. Программист (то есть вы) должен реализовать какой-то способ его сохранения. Один из подходов к этому - добавить переменные rows и seats_per_row в структуру theatre_seating, а затем проверять их при каждом использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...