C - 在函数中将多维数组更改为CONST?

时间:2011-07-28 19:17:33

标签: c

我有以下c函数声明:

float Sum2d( const unsigned int nRows, const unsigned int mCols, float arr[nRows][mCols] )
{
    float sumAll = 0;

    // I would like to make this change illegal! 
    arr[0][0] = 15;

    for (int i = 0; i < nRows; i++)
        for (int j = 0; j < mCols; j++)
            sumAll += arr[i][j];

    return sumAll;
}

使用代码:

int main()
{
    // define a 2d float array
    float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};

    // calculate the sum
    float sum = Sum2d(3, 2, myArr2d);

    // print the sum
    printf("%f\n", myOpResult);

    // return 1
    return 1;
}

此功能运行良好,但存在一个问题:arr功能中可以更改Sum2d()的元素。

如何更改Sum2d()原型以防止对arr's元素进行任何更改?

3 个答案:

答案 0 :(得分:3)

具有const限定条件的多维数组很难处理。基本上你可以选择在每个调用端转换非const数组,以完全避免这些const数组作为参数,或者通过使用一些复杂的宏来偏离。这是一个较长的故事,您可以阅读here

答案 1 :(得分:1)

我不知道你正在使用什么编译器,但这不能编译为C或C ++。

但无论如何,只要制作arr const就足够了。

答案 2 :(得分:-2)

将函数的原型更改为使用const with float

你也在数组参数中指定了nRows / nCols,这在C中是不允许的。如果你不知道数组的边界,请使用双指针。

此方法不会阻止函数中的类型转换。

#include <stdio.h>

float Sum2d( const unsigned int nRows, const unsigned int mCols, const float arr[][2] )
{
    float sumAll = 0;

    // I would like to make this change illegal! 
    //arr[0][0] = 15;

    for (int i = 0; i < nRows; i++)
        for (int j = 0; j < mCols; j++)
            sumAll += arr[i][j];

    return sumAll;
}

int main()
{
    // define a 2d float array
    float myArr2d[3][2] = {{1,2}, {3,4}, {5,6}};

    // calculate the sum
    float sum = Sum2d(3, 2, (const float (*)[2])myArr2d);

    // print the sum
    printf("%f\n", sum);

    // return 1
    return 1;
}

由于您使用以下命令行,我想:

gcc <file.c> -o out -std=c99

Running on Debian Squeeze
$ gcc array.c -o array -std=c99

$ gcc --version       
gcc (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO   
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.