据我所知,创建矩阵的两种方法应该相同:
第一种方式:
int i;
int **matrix = (int**)malloc(R*sizeof(int*));
for (i=0; i<R; i++)
matrix[i] = (int*)malloc(C*sizeof(int));
第二种方式:
int matrix[R][C];
将R和C声明为:
#define R 3
#define C 5
我的问题是,当我将第二种方式声明矩阵传递给这样的函数时:
void myfunction(int **m, int rows, int columns);
代码:
myfunction(matrix,R,C);
为什么一旦我尝试触摸矩阵内的值,它就会给我一个分段错误?
当我将第一种声明矩阵传递给像这样的函数时,同样的情况发生了:
void myfunction(int m[][C], int rows, int columns);
我缺少什么?
答案 0 :(得分:3)
答案 1 :(得分:0)
您正在此处访问内存越界:
for (i=0; i<C; i++)
matrix[i] = (int*)malloc(C*sizeof(int));
您的R = 3
和C = 5
您为R
int pointers
分配了内存,然后为C
指针分配了C
整数变量的空间。
(用值替换变量):
您为3 int pointers
分配了内存,然后为5个指针分配5个整数变量的空间。
在你的第一个案例中:
它应该给Seg。一旦访问matrix[3]
就会出错,但无论如何它都是未定义的行为,你什么都不能说。
在你的第二个案例中:
代码应该可以正常工作,除非你在myfunction()
内做同样的错误(Mem Access Out-of-bounds)。
答案 2 :(得分:0)
您正在访问数组越界。然后结果是不确定的。该行应更正如下
for (i=0; i<R; i++)
matrix[i] = (int*)malloc(C*sizeof(int));