使用经典矩阵代替动态分配时的分段错误

时间:2013-10-14 16:30:47

标签: c matrix

据我所知,创建矩阵的两种方法应该相同:

第一种方式:

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);

我缺少什么?

3 个答案:

答案 0 :(得分:3)

第一种方法是将一个指针数组分配给已分配的int数组。 第二种方式分配单个数组并使用C参数计算正确的偏移量。

它们不可互换。

请参阅the bottom part of this page了解差异。

答案 1 :(得分:0)

您正在此处访问内存越界

for (i=0; i<C; i++)
    matrix[i] = (int*)malloc(C*sizeof(int));

您的R = 3C = 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));