为什么我在打印由 "main" 函数传递的二维数组时出现段错误

why i get segment error when i print 2-D array which is delivery by the "main" function

为什么我在打印由“main”函数传递的二维数组时出现段错误?有一个条件是数组必须作为 int** 传递。我该怎么做?

#include <stdio.h>

void display_matrix(int** matrix, int row, int column) {
    printf("%d\n", matrix[1][2]);
}

void main() {
    int m[3][4] = {
        {1, 3, 5, 7},
        {10, 11, 16, 20},
        {23, 30, 34, 60}
    };
    display_matrix((int**) m, 3, 4);
}

您遇到了分段错误,因为您将一个整数数组传递到需要指针数组的位置。

你必须准备一个int*的数组。

#include <stdio.h>

void display_matrix(int** matrix, int row, int column) {
    printf("%d\n", matrix[1][2]);
}

int main(void) {
    int m[3][4] = {
        {1, 3, 5, 7},
        {10, 11, 16, 20},
        {23, 30, 34, 60}
    };
    int* m_ptr[3] = {m[0], m[1], m[2]};
    display_matrix(m_ptr, 3, 4);
}

对于根据 C 标准的初学者,不带参数的函数 main 应声明为

int main( void )

数组声明为

int m[3][4] = {
    {1, 3, 5, 7},
    {10, 11, 16, 20},
    {23, 30, 34, 60}
};

用在表达式中,极少数情况下会转换为指向其类型 int ( * )[4].

的第一个元素的指针

所以类型 int ( * )[4] 和类型 int ** 不兼容。为上面声明的数组取消引用 int ** 类型的指针,您将获得不是有效地址的值 1。所以函数调用了未定义的行为。

因此,接受这样的数组作为参数的函数应该声明为

void display_matrix( int ( *matrix )[4], size_t rows );

函数可以像

那样调用
display_matrix( m, 3 );

或者,如果您的编译器支持可变长度数组,那么可以像这样声明函数

void display_matrix( size_t rows, size_t cols, int ( *matrix )[cols] );

函数可以像

那样调用
display_matrix( 3, 4, m );

这样一个函数的声明

void display_matrix(int** matrix, int row, int column);

通常在动态分配数组时使用,如

int **m = malloc( 3 * sizeof( int * ) );
for ( size_t i = 0; i < 3; i++ )
{
    m[i] = malloc( 4 * sizeof( int ) );
}

//... initialization of the arrays and


display_matrix( m, 3, 4 );

因此要么动态定义数组,要么使用另一个声明为

的数组
int * a[3] = { m[0], m[1], m[2] };

并将此数组而不是数组 m 传递给您的函数。

在这种情况下,数组 a 用作此调用中的参数表达式

display_matrix( a, 3, 4 );

将隐式转换为 int **.

类型的指针