Задать вопрос
@BiProg

Как передать ссылку на двумерный массив в функцию?

Пытаюсь передать ссылку в функцию, заполнить там, потом другой функцией вывести, но заполняет только одну строку, и при переходе на следующую крашит с ошибкой segmentation fault.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define XMAX 10
#define YMAX 5

int mat(int ***matrix, int m, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      printf("x: %d / y: %d /  ", i, j);
      *matrix[i][j] = 1;
    }

  return 0;
}

int mato(int ***matrix, int m, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (j == m - 1) {
          printf("%d\n", *matrix[i][j]);
      } else {
          printf("%d ", *matrix[i][j]);
      }
  return 0;  
}

int main() {
    int **matrix = malloc(XMAX * YMAX * sizeof(int) + XMAX * sizeof(int*));
    int *ptr = (int*) (matrix + XMAX);
    for (int i = 0; i < XMAX; i++) {
        matrix[i] = ptr + YMAX * i;
    }
    
    if (mat(&matrix[0][0], XMAX, YMAX) != 0) {
      free(matrix);
      return 1;
    }
    
    mato(&matrix, XMAX, YMAX);
    
    free(matrix);
    return 0;
}
  • Вопрос задан
  • 41 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
int mat(int ***matrix, int m, int n) {

Зачем три звёздочки? Для двумерного массива достаточно было бы двух:

int mat(int **matrix, int m, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      printf("x: %d / y: %d /  ", i, j);
      matrix[i][j] = 1;
    }

  return 0;
}

int mato(int **matrix, int m, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (j == m - 1) {
          printf("%d\n", matrix[i][j]);
      } else {
          printf("%d ", matrix[i][j]);
      }
  return 0;  
}

int main() {
    int **matrix = malloc(XMAX * YMAX * sizeof(int) + XMAX * sizeof(int*));
    ...
    if (mat(matrix, XMAX, YMAX) != 0) {
      free(matrix);
      return 1;
    }
    
    mato(matrix, XMAX, YMAX);
    ...
}


В коде с тремя звёздочками конкретно здесь:
mat(&matrix[0][0], XMAX, YMAX)
передаётся неправильный указатель, потому что matrix --- это не настоящий двумерный массив, и matrix и &matrix[0][0] указывают в разные места.

Ну и порекламирую свой давнишний обзорный ответ на подобный вопрос.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы