为什么我在打印由 "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 **
.
类型的指针
为什么我在打印由“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 **
.