указатель на указатель в виде 2d массива - PullRequest
0 голосов
/ 29 марта 2019

Мой фон - Java, поэтому я не привык к указателям, следующий код выдает ошибку, и я не вижу пути:

#include <stdio.h>
#define DIM 2
void sort_intervals(int** intervals, int n);
int main()
{
   int a[3][DIM] = {
         {1, 6} ,
         {4, 9} ,
         {3,17} };
    sort_intervals(a, 3);
  return 0;
}
void sort_intervals(int** intervals, int n)
{
  printf("%d ", intervals[0][0]);//<--- error here
}

Ошибка: место чтения нарушения прав доступа

Мне не разрешено менять сигнатуру функции

Ответы [ 3 ]

2 голосов
/ 29 марта 2019

Тогда вам нужен массив указателей, которые указывают на массивы.

int a_1[DIM] = {1, 6};
int a_2[DIM] = { ... };
int a_3[DIM] = { ... };
int *a[3] = { a_1, a_2, a_3, }; // array of 3 pointers
sort_intervals(a, 3);

или в точности эквивалентно, используя составные литералы, которые вы можете:

int *a[3] = { (int[DIM]){1, 6}, (int[DIM]){2, 7}, (int[DIM]){3, 17}};
sort_intervals(a, 3);

даже

sort_intervals((int*[3]){
    (int[DIM]){1, 6},
    (int[DIM]){2, 7},
    (int[DIM]){3, 17},
}, 3);
1 голос
/ 29 марта 2019

Если вы не можете изменить подпись, как вы объяснили в своем комментарии, то вы можете сделать это с помощью зубчатого массива:

#define DIM 2
void sort_intervals(int** intervals, int n);
int main()
{
    int **a = malloc(3 * sizeof(int*));
    for (int i = 0; i < 3; i++) {
        a[i] = malloc(DIM * sizeof(int));
    }
    a[0][0] = 1; a[0][1] = 6;
    a[1][0] = 4; a[1][1] = 9;
    a[2][0] = 3; a[2][1] = 17;

    sort_intervals(a, 3);
    for (int i = 0; i < 3; i++) {
        free(a[i]);
    }
    free(a);
  return 0;
}
void sort_intervals(int** intervals, int n)
{
  printf("%d ", intervals[2][0]);//<--- error here
}
1 голос
/ 29 марта 2019

Я предполагаю, что вы можете изменить основную функцию.Вы также можете инициализировать a как двойной указатель, такой как:

int **a = (int**)calloc(3, sizeof(int*)); //setting a as array of 3 pointers 
  for (int i = 0; i < 3; i++)            
     *a = (int*) calloc(DIM, sizeof(int));     //assigning pointer to a[0], a[1] and a[2]

Здесь a - массив из 3 целочисленных указателей.a [0], a [1] и a [2] являются указателями int.Вы можете изменить как [0] [0] = 5;

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