интервал ** по сравнению с интервалом [СТРОКИ] [СЕДЛА] [дубликат]

8
задан Community 23 May 2017 в 10:24
поделиться

6 ответов

Вы пытаетесь присвоить переменную с двойным указателем массиву... это было рассмотрено исчерпывающе, смотрите здесь для информации об этом. Более того, поскольку вы объявили

int arr[2][2] = ...;

и затем пытаетесь присвоить arr двойному указателю

int ** ptr = ... ;

что гарантированно не сработает, следовательно, произойдет ошибка сегментации. Более того, оператор int ** ptr=(int**) arr; фактически является приведением одного типа (т.е. [][]) к другому типу (т.е. **), несмотря на то, что они имеют тип 'int'. Они оба разные, и компилятор будет интерпретировать это совершенно по-разному...

Вы можете сделать это так:

int *ptr = &arr;

Теперь *(ptr + 1) будет ссылаться на 0-й ряд, *(ptr + 2) - на 1-й ряд и так далее. Единственное, что от вас требуется, это не выйти за пределы маркеров, где используется arr, иначе может произойти переполнение или даже ошибка сегментации...

1
ответ дан 5 December 2019 в 18:57
поделиться

То, что вы делаете сейчас, означает создание массивов указателей, где каждый указатель был явно приведен . Следовательно, у вас будет массив указателей типа ( 0x00001, 0x00002, 0x00003 и 0x00004 ).

При разыменовании эти указатели вызывают ваш segfault.

2
ответ дан 5 December 2019 в 18:57
поделиться

Вы не можете преобразовать линейный массив в тип указатель на указатель, поскольку int ** не содержит тех же данных int [] [] делает. Первый содержит указатели на указатели на целые числа. Второй хранит последовательность int в линейной памяти.

5
ответ дан 5 December 2019 в 18:57
поделиться

int arr[2][2][2] не является массивом массивов - это один двухмерный массив. В памяти он неотличим от int arr[4]

Что вам действительно нужно, так это

int (*ptr)[2] = arr;
0
ответ дан 5 December 2019 в 18:57
поделиться

Нет, int ** - это указатель на указатель на int, но двумерный массив - это массив массивов, а &(arr[0][0]) - это указатель на int.

Я считаю, что вы должны делать так:

int *ptr = arr;
cout<<*ptr; 

или так:

int *ptr = &arr[0][0];
cout<<*ptr; 
1
ответ дан 5 December 2019 в 18:57
поделиться

Попробуйте

int *ptr = arr;

Дополнительные пояснения:

Вы должны назначить адрес указателю, чтобы его можно было разграничить (я имею в виду оператор *). Что вы делаете, так это указываете ptr на ячейку памяти с адресом [0] [0]. Следовательно, вы получаете ошибку сегментации.

0
ответ дан 5 December 2019 в 18:57
поделиться