Давайте посмотрим на логику вашего кода:
*(*(p+i)+j) = true;
Эта попытка эквивалентна p[i][j]
, а фактически равна .Проблема в том, что p
не является bool[][]
.Это даже не bool**
.Это bool*
, который является указателем на bool
, который может также быть первым элементом массива.
Обратите внимание, что то, что я собираюсь объяснить, действительно только для T[][]
массивов.Это недопустимо для динамически размещаемого массива, у которого есть строки, также динамически выделяемые.
То, что я собираюсь объяснить, основано на том факте, что двумерный (или три, или четыре ...) массив измерений реализован какодин, большой, одномерный массив.Если у вас есть bool[3][3]
, это на самом деле bool[9]
под капотом, с некоторыми преимуществами в отношении синтаксиса доступа (в виде [x][y]
доступа).
Теперь давайте еще раз посмотрим на ваш код:
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
if(rand()% 2)
*(*(p+c)+j) = true;
else
*(*(p+c)+j) = false;
}
}
Ваш внешний цикл for()
перебирает строки массива.Ваш внутренний цикл for()
перебирает элементы одной строки.
Если вы передали bool**
как p
, на самом деле будет работать !Но ты не сделал.Вы передали bool*
, который указывает на один массив.Вы используете преимущества реализации T[][]
(двумерный массив) в форме работы с ним, как если бы он был больше T[]
.
Теперь вам нужен доступ к i
-й строкеи j
й элемент.Для этого вам необходимо:
Простое исправление могло бы изменить это:
*(*(p+i)+j) = true;
на это:
*(p+i*c+j) = true;
Второй разыменяет элемент, который находится в i
-й строке (вы должны умножить i
на c
, потому чтонапример, первый элемент третьей строки является 3*c
-ым элементом вашего одномерного представления вашего двумерного массива) и находится в позиции j
.