在我的简介中,我们看到了使用指针将数组传递给函数的过程。到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)
答案 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]初始化。为了实现您想要的目标,您需要做以下两件事之一: