Доступ к 2D-массиву с использованием двойного указателя на функцию языка C

Я пытаюсь найти максимум всех значений в 2D-массиве, доступ к которому осуществляется из функции C с помощью двойного указателя. Когда я запускаю код, он просто завершается, возвращая любое значение вызывающей функции.

Я попытался изменить код для печати всех значений, чтобы выяснить проблему, и обнаружил, что он печатает только 1 и 2 для следующих образцов данных в качестве входных данных. Для запуска примера кода я указал строку = 2, столбец = 2 и значения = 1,2,3,4.

Пожалуйста, дайте мне знать, почему? Также, если ваш вопрос не ясен, пожалуйста, так и скажите. У меня был тяжелый день, поэтому, возможно, я не смогу объяснить лучше.

В коде есть несколько ограничений: 1. Сигнатура функции (int **a,int m,int n)

#include<stdio.h>

int findMax(int **a,int m,int n){

  int i,j;
  int max=a[0][0];
  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      if(a[i][j]>max){
         max=a[i][j];
      }
      //printf("\n%d",a[i][j]);
    }
  }

return max;
}

int main(){
  int arr[10][10],i,j,row,col;
  printf("Enter the number of rows in the matrix");
  scanf("%d",&row);
  printf("\nEnter the number of columns in the matrix");
  scanf("%d",&col);

  printf("\nEnter the elements of the matrix");
  for(i=0;i<row;i++){
    for(j=0;j<col;j++){
      scanf("%d",&arr[i][j]);
    }
  }

  printf("\nThe matrix is\n");
  for(i=0;i<row;i++){
    for(j=0;j<col;j++){
      printf("%d ",arr[i][j]);
    }
    printf("\n");
  }
  int *ptr1 = (int *)arr;
  printf("\nThe maximum element in the matrix is %d",findMax(&ptr1,row,col));
  return 0;
}

person Gagan Verma    schedule 13.03.2016    source источник
comment
int **a не настоящий 2D-массив. int **a --› int (*a)[10]   -  person BLUEPIXY    schedule 13.03.2016
comment
Вы выполняете кастинг arr и в результате получаете к нему неправильный доступ. Я удивлен, что вы не получаете ошибку сегментации. Удалите приведение и вместо этого исправьте свои объявления, чтобы объявить правильные типы указателей.   -  person Tom Karzes    schedule 13.03.2016
comment
Конец вашего вопроса читается так, что это больше, чем ограничение. Можно ли изменить объявление/распределение массива в main?   -  person Martin Zabel    schedule 13.03.2016
comment
@BLUEPIXY Спасибо за ответ. Я внес изменения, и это сработало.   -  person Gagan Verma    schedule 13.03.2016
comment
@TomKarzes да, спасибо. Я нашел ошибку и исправил ее.   -  person Gagan Verma    schedule 13.03.2016
comment
@MartinZabel Извините за вводящую в заблуждение строку. Было только одно ограничение. И да, любое другое изменение разрешено внутри «основного».   -  person Gagan Verma    schedule 13.03.2016


Ответы (1)


В коде есть несколько ограничений: 1. Сигнатура функции (int **a,int m,int n)

Я предполагаю, что ваша задача состоит в том, чтобы использовать массив указателей, каждый из которых указывает на распределение?

#include<stdio.h>
#include<stdlib.h>

int findMax(int **a,int m,int n){

  int i,j;
  int max=a[0][0];

  for(i=0; i<m; i++)
  {
      for(j=0; j<n; j++)
      {
        if(a[i][j]>max)
        {
            max=a[i][j];
        }
      //printf("\n%d",a[i][j]);
      }
  }

return max;
}

int main(){
    int **arr;
    int i,j,row,col;
    printf("Enter the number of rows in the matrix");
    scanf("%d",&row);
    printf("\nEnter the number of columns in the matrix");
    scanf("%d",&col);

    arr = malloc(row * sizeof(int*));
    if (!arr)
    {
        printf("arr not malloc'd\n");
        abort();
    }

    for(i=0;i<row;i++)
    {
        arr[i] = malloc(col * sizeof(int));
        if (!arr[i])
        {
            printf("arr[%d] not malloc'd\n", i);
            abort();
        }

        for(j=0;j<col;j++)
        {
          arr[i][j] = i * j;
        }
    }

    printf("\nThe matrix is\n");
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
          printf("%d ",arr[i][j]);
        }
        printf("\n");
    }


    printf("\nThe maximum element in the matrix is %d",findMax(arr, row, col));
    return 0;
}

Задача сделать это в одном malloc оставлена ​​читателю в качестве упражнения.

person Pod    schedule 13.03.2016