将多维数组传递给C中的函数时的分段错误

时间:2018-11-17 00:59:43

标签: c macos segmentation-fault

在我的简介中,我们看到了使用指针将数组传递给函数的过程。到C类,我正在尝试学习如何自行传递多维数组。我尝试编写一个函数以将矩阵的项的值分配给本地数组,但是遇到了分段错误。我希望有人能够解释为什么会发生这种情况以及如何解决。我在macOS Sierra上使用终端。提前致谢。我的代码如下:

def timeit(stmt="pass", setup="pass", timer=default_timer,
           number=default_number, globals=None):
    """Convenience function to create Timer object and call timeit method."""
    return Timer(stmt, setup, timer, globals).timeit(number)

2 个答案:

答案 0 :(得分:4)

给出声明

int matrix[rows][cols];

此代码是错误的:

fillMatrix(&matrix[rows][cols], rows, cols);

&matrix[rows][cols]的地址超出了矩阵的末尾。

矩阵的第一个元素是&matrix[0][0],矩阵的最后一个元素是&matrix[rows-1][cols-1]

此声明

void fillMatrix();

将导致此定义问题:

void fillMatrix( int *matrix, int rows, int cols ){
    ...

他们需要匹配。现在,由于void fillMatrix()的声明很明显,参数通过default argument promotion传递给函数,但是由于定义具有显式参数,因此函数本身希望参数作为int *int传递。您可能对此并没有问题,因为这些参数的默认值可能与这些参数相同,但是函数定义和声明通常必须完全匹配。

我没有检查您的代码是否有其他问题。

答案 1 :(得分:1)

在C中,当您声明数组时,需要在编译时指定其大小。当您使阵列的行减速时

    int matrix[rows][cols];

您实际上是使用垃圾值来初始化其大小的。对于我的编译器,它的大小为[0] [0]初始化。为了实现您想要的目标,您需要做以下两件事之一:

  1. 在编译之前明确指定数组的大小
  2. 动态地为数组分配空间