Pergunta

Por que o código a seguir me dá uma falha de segmentação?

#define MAXROWS 10
#define MAXCOLS 10
void getInput (int *data[MAXROWS][MAXCOLS]) {
  int rows, cols;
  int curRow, curCol;
  printf ("How many rows and cols?");
  scanf ("%d %d", rows, cols);

  for (curRow = 0; curRow < rows; curRow++) {
    for (curCol = 0; curCol < cols; curCol++) {
      scanf ("%d", data[curRow][curCol]);
      printf ("%d\n", *data[curRow][curCol]);
    }
  }
}

void main () {
  int data[MAXROWS][MAXCOLS];

  getInput (data);
}

Parece ser que o scanf e printf As declarações não estão recebendo o tipo de dados certo, mas não consigo descobrir o que elas deve ser.

Como posso alterá -lo para que funcione corretamente?

Foi útil?

Solução

Isso declara uma variedade de MAXROWS Matrizes de ponteiros para int.

int *data[MAXROWS][MAXCOLS];

No entanto, em uma definição de função, as matrizes de nível superior (de qualquer tamanho) são equivalentes aos ponteiros, porque as matrizes sempre se deterioram a ponteiros para o tipo de membro da matriz na passagem para uma função.

Portanto, sua definição de função é equivalente a:

void getInput (int *(*data)[MAXCOLS])

ou seja, um ponteiro para uma variedade de MAXCOLS ponteiros para int.

Como seu código permanece, você nunca inicializa nenhum dos int Ponteiros na matriz, enquanto você está passando uma matriz 2D de ints como um ponteiro para uma matriz 2D de int *.

O que você provavelmente quer passar é um ponteiro para uma variedade de MAXCOLS int:

void getInput (int (*data)[MAXCOLS])

ou equivalente:

void getInput (int data[][MAXCOLS])

Então você faz o seguinte:

int main(void)
{
    int data[MAXROWS][MAXCOLS];

    getInput(data);

    return 0;
}

Você está passando sua matriz 2D como um ponteiro para seu primeiro elemento (um ponteiro para uma fileira ou uma matriz de MAXCOLS ints).

Se você garantir que altere, certifique -se de mudar:

  scanf ("%d", data[curRow][curCol]);
  printf ("%d\n", *data[curRow][curCol]);

para:

  scanf ("%d", &data[curRow][curCol]);
  printf ("%d\n", data[curRow][curCol]);

Além disso, verifique seus parâmetros aqui:

scanf ("%d %d", &rows, &cols);

Você precisa estar passando indicadores para rows e cols.

Certifique -se de adicionar alguns limites verificando à sua função de entrada para não tentar ler mais linhas e colunas do que MAXROWS ou MAXCOLS.

Outras dicas

Scanf aceita o endereço de variáveis, não o conteúdo dele:

void getInput (int data[][MAXCOLS]) {
  int rows, cols;
  int curRow, curCol;
  printf ("How many rows and cols?");
  scanf ("%d %d", &rows, &cols);
  //scanf ("%d %d", &rows, &cols);
  for (curRow = 0; curRow < rows; curRow++) {
    for (curCol = 0; curCol < cols; curCol++) {
          scanf ("%d", &data[curRow][curCol]);
          printf ("%d\n", data[curRow][curCol]);
        }
    }
}

Havia alguns problemas diferentes.

Primeiro, ao passar as matrizes para as funções, você só precisa da definição de dimensões N-1. Por exemplo, se você estiver passando por uma matriz 3D, colocaria o tamanho das duas últimas dimensões na função SIG e deixaria a primeira em vazio.

foo(int threeD[][10][15]);

Segundo, o scanf pega o endereço do argumento, que para sua matriz se parece com isso

&data[curRow][curCol]

Terceiro, você deve sempre verificar o intervalo de sua entrada para garantir que seja válido:

  if (rows > MAXROWS || cols > MAXCOLS) {
    printf("Bad array dimensions\n");
    return;
  }

Quarto, sempre compilar com todos os avisos ativados - o compilador o alertará sobre o trabalho dessas coisas:

gcc -Wall pass_array.c -o pass_array

.

#include <stdio.h>

#define MAXROWS 10
#define MAXCOLS 10

void getInput (int data[][MAXCOLS]) {
  int rows, cols;
  int curRow, curCol;
  printf ("How many rows and cols?");
  scanf ("%d %d", &rows, &cols);

  if (rows > MAXROWS || cols > MAXCOLS) {
    printf("Bad array dimensions\n");
    return;
  }

  for (curRow = 0; curRow < rows; curRow++) {
    for (curCol = 0; curCol < cols; curCol++) {
      scanf ("%d", &data[curRow][curCol]);
      printf ("%d\n", data[curRow][curCol]);
    }
  }
}

int main () {
  int data[MAXROWS][MAXCOLS];

  getInput (data);
    return 0;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top