1

As far as i know this two ways to create a matrix should be identical:

First way:

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

Second way:

int matrix[R][C];

with R and C declared as:

#define R 3
#define C 5

My question is, when i pass the second way declared matrix to a function like this:

void myfunction(int **m, int rows, int columns);

with the code:

myfunction(matrix,R,C);

why does it give me a Segmentation fault as soon as i try to touch the values inside the matrix?

The same happens when i pass the first way declared matrix to a function like this:

void myfunction(int m[][C], int rows, int columns);

What am i missing?

4

3 回答 3

3

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

它们不可互换。

有关差异,请参见本页底部

于 2013-10-14T16:36:33.090 回答
0

您正在越界访问数组。然后结果是不确定的。该行应更正如下

for (i=0; i<R; i++)
    matrix[i] = (int*)malloc(C*sizeof(int));
于 2013-10-14T16:37:47.187 回答
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().

于 2013-10-14T16:34:19.503 回答