在C中的函数中初始化静态数组

时间:2014-10-14 18:02:41

标签: c

可以在函数中初始化/变异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);

编辑:

我在这里找到了对这个问题的一个很好的解释:

http://c-faq.com/aryptr/pass2dary.html

4 个答案:

答案 0 :(得分:2)

您传递的是二维数组,而不是指向指针的指针。您将不得不更改函数参数类型。

void initialize( int a, int b , int p[][b] ) 
{
    ...

由于您必须定义数组p的大小,因此首先声明参数ab,然后使用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) 

将多维数组传递给函数时,不必指定第一个数组维。但是,必须向函数提供第二个(和后续)维度。