Ошибка сегментации при передаче матрицы в функцию C

Я не могу понять, что не так с этим фрагментом кода (и не смог найти никаких советов из предыдущих вопросов и ответов):

#include<stdio.h>

void fld(const int **b){
int i, j ;
printf("Hello R\n");
for (i=0; i<3; i++){
    for (j = 0; j<3; j++)
        printf("%d", b[i][j]);
    printf("\n");
    }
return;
}

int main(){
int i, j;
int b[3][3] = {
            {1,1,1},
            {1,2,1},
            {2,2,2}
            };

fld((void **)b);
system("pause");
return;
}

Я пытался передать матрицу в функцию поля и распечатать ее, но он продолжает сообщать об ошибке сегментации во время выполнения кода.

2 ответа

Решение
void fld(const int b[][3]){
    int i, j;
    printf("Hello R\n");
    for (i=0; i<3; i++){
       for (j = 0; j<3; j++)
           printf("%d", b[i][j]);
       printf("\n");
    }
return;
}

int main(int argc, char** argv) {

int b[3][3] = {
        {1,1,1},
        {1,2,1},
        {2,2,2}
        };

fld(b);
return 0;
};

Компилируется и работает с g++

Вот версия, которая динамически распределяет память в куче. Это работает как main() аргумент *argv[] а именно массив массивов (хотя в этом случае длины строк могут отличаться). В этом ответе вам не нужно передавать размеры массива для fld() работать: но сказать, когда остановиться! Причина в том, что это одномерный массив указателей массивов, каждый из которых также является одномерным массивом. Вы можете распространить тот же подход на 3-D массив.

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

int **intarray(int rows, int cols) {
    int r;
    int **arr = malloc(rows*sizeof(int*));   // here an array of pointers
    if (arr == NULL)
         return NULL;
    for (r=0; r<rows; r++) {
        arr[r] = malloc(cols*sizeof(int));   // here an array of ints
        if (arr[r] == NULL)
             return NULL;
    }
    return arr;
}

void fld(const int **b, int rows, int cols){
    int i, j ;
    printf("Hello R\n");
    for (i=0; i<rows; i++){
        for (j = 0; j<cols; j++)
            printf("%-5d", b[i][j]);
        printf("\n");
        }
return;
}

int main(void) {
    int i, j;
    int **b = intarray(3, 3);
    if (b == NULL)
        return 0;
    for (i=0; i<3; i++)
        for (j=0; j<3; j++)
            b[i][j] = i*100 +j;
    fld(b, 3, 3);

    // free() the memory
    return 0;
}

Выход программы

Hello R
0    1    2
100  101  102
200  201  202
Другие вопросы по тегам