可以在函数中初始化/变异main
中声明的静态数组吗?
我尝试了下面的代码,但它返回了一个seg错误。
void initialize(int **p, int a, int b)
{
int i, j;
for(i=0; i<a; ++i) {
for(j=0; j<b; ++j)
p[i][j] = j;
}
}
int m = 5;
int n = 5;
int arr[m][n];
int **A = &arr[0][0];
initialize(A, m, n);
编辑:
我在这里找到了对这个问题的一个很好的解释:
答案 0 :(得分:2)
您传递的是二维数组,而不是指向指针的指针。您将不得不更改函数参数类型。
void initialize( int a, int b , int p[][b] )
{
...
由于您必须定义数组p
的大小,因此首先声明参数a
和b
,然后使用b
来确定大小。< / p>
答案 1 :(得分:1)
在编译器中启用警告,您将获得此信息:
warning: passing argument 1 of ‘initialize’ from incompatible pointer type [enabled by default]
结果,您收到了一个seg。故障。
您需要将函数的原型更改为:
void initialize(int a, int b, int p[][b]);
并且函数的调用将是:
initialize(m, n, A);
答案 2 :(得分:1)
是的,如果他们不能,他们可以,不会非常有用。
然而,您遇到了尝试将数组衰减到指针的方式的问题。你在main
中声明的是一个二维数组 - 一个单独的内存块,恰好通过两个索引的组合索引(在编译时翻译)。你试图把它当作一个指向数组的指针数组来衰减它 - 这意味着在initialize
内,你取消引用指针,尝试获取指针,然后取消引用以获得一个插槽。由于二维数组实际上描述了单个内存块,因此两层指针间接不能用于访问它。您需要将其衰减为仅涉及一级指针间接的类型。
答案 3 :(得分:0)
更改
initialize(A, m, n);
void initialize(int **p, int a, int b)
到
initialize(n, A, m);
void initialize( int b, int p[][b], int a)
将多维数组传递给函数时,不必指定第一个数组维。但是,必须向函数提供第二个(和后续)维度。