почему мы не можем получить доступ к 2D массиву из 1D массива? Как я могу получить доступ? - PullRequest
0 голосов
/ 06 января 2020

Почему мы не можем получить доступ к 2D-массиву как к 1D-массиву? Как я могу получить доступ?

Функция массива:

int **combination(int no)
{

int i,j,c=0;
static int arr[100][2];

for(i=0;i<=no;i++){
    for(j=0;j<=no;j++){
        if(((i+j)==no)){
            arr[c][0]=i;
            arr[c][1]=j;
            c++;
            }
    }
}

return arr;
}

Основная функция:

int main() {
    int n,k,i;
    int **arr;
    int size=10;//let us assume.

    scanf("%d %d", &n, &k);
    fprintf(stderr, "1\n");
    arr=combination(n);
    fprintf(stderr, "2\n");

    for(i=0;i<size;i++){
    printf("%d-%d",arr[i][0],arr[i][1]);
}
    return 0;
}

Показывает:

.c:29:8: warning: return from incompatible pointer type [-Wincompatible-pointer-types] return arr

и ядро ​​ошибки сегментации сброшено.

Можете ли вы предложить, какой тип указателя вызывать для доступа к элементу из этого 2D-массива?

1 Ответ

2 голосов
/ 06 января 2020

Это потому, что int arr[100][2] ( указатель на массив int [2] ) не совместим с int** ( указатель на указатель на int ).

Почему?

Стандарт C11 - 6.3.2.1 Другие операнды - L-значения, массивы и обозначения функций (p3)

Array преобразование указателя

(p3) За исключением случаев, когда это операнд оператора sizeof, оператор _Alignof или унарный оператор '&' или строковый литерал 1024 * используется для инициализации массива, выражение с типом «массив типа» преобразуется в выражение с типом «указатель на тип» , которое указывает на начальный элемент объект массива и не является lvalue.

При применении 6.3.2.1 (p3) к int arr[100][2] результат будет int (*arr)[2] ( указатель на массив int [2] ) который не int**. Таким образом, ваш компилятор правильно генерирует предупреждение.

Если вы действительно хотите сделать это таким образом, то в main() измените ваше объявление arr на:

    int (*arr)[2];

И затем измените объявление вашей функции в:

int (*(combination)(int no))[2]

( функция принимает (int no) возвращает int (*...)[2] указатель на массив int [2] )

Вы также должны ограничить значение c в своей функции до 100, чтобы предотвратить превышение границ массива.

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