简体   繁体   中英

Segmentation fault in passing multidimensional arrays to functions in C

We saw passing arrays to functions using pointers in my intro. to C class, and I'm trying to learn how to pass multidimensional arrays on my own. I tried writing a function to assign the values of the entries of a matrix onto a local array, but I get a segmentation fault. I was hoping someone could explain why this happens and how to fix it. I'm using the terminal on macOS Sierra. Thanks in advance. My code is below:

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

void fillMatrix();

int main(void){
    int rows, cols;

    printf("\nEnter the number of columns:\n");
        scanf("%d", &cols);
    printf("\nEnter the number of rows:\n");
        scanf("%d", &rows);

    int matrix[rows][cols];


    fillMatrix(&matrix[rows][cols], rows, cols);

    for (int i = 0; i < rows; ++i){
        for (int j = 0; j < (cols - 1); ++j){
            printf("%d ", matrix[i][j]);
        } printf("%d\n", matrix[i][(cols -1)]);
    }
    return 0;
}

void fillMatrix( int *matrix, int rows, int cols ){
    for (int i = 0; i < rows; ++i){
        for (int j = 0; j < cols; ++j){
            printf("\nPlease enter the A(%d,%d) entry:\n", i, j);
                scanf("%d", &*(matrix + (i*cols) + j));
        }
    }
    return;
}

Given the declaration

int matrix[rows][cols];

This code is wrong:

fillMatrix(&matrix[rows][cols], rows, cols);

The address of &matrix[rows][cols] is past the end of the matrix.

The first element of the matrix is &matrix[0][0] , and the last element of the matrix is &matrix[rows-1][cols-1] .

Also, this declaration

void fillMatrix();

will cause problems with this defintion:

void fillMatrix( int *matrix, int rows, int cols ){
    ...

They need to match. Right now, because of the void fillMatrix() declaration up top, arguments get passed to the function via default argument promotion , but because the definition has explicit arguments, the function itself expects the arguments to be passed as int * or int . You're probably not having problems with that as the defaults for those arguments are likely the same as those arguments, but function definitions and declarations generally must match exactly.

I haven't examined your code for other issues.

In C when you are declaring an array you need to specify its size at the time of compilation. When you decelerate the array in line

    int matrix[rows][cols];

You actually initialise its size with rubbish values. In case of my compiler it was initialised with size of [0][0]. In order to achieve what you want you need to do one of two things:

  1. Specify explicitly what is the size of the array before compilation
  2. Dynamically allocate space for the array

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM