相关疑难解决方法(0)

const数组指针的正确性?

有人提出一个论点,说在现代C中,我们应该总是通过数组指针将数组传递给函数,因为数组指针具有强类型.例:

void func (size_t n, int (*arr)[n]);
...

int array [3];
func(3, &array);
Run Code Online (Sandbox Code Playgroud)

这听起来像防止各种类型相关和数组越界错误可能是一个好主意.但后来我发现我不知道如何将const正确性应用于此.

如果我这样做void func (size_t n, const int (*arr)[n])那么它是正确的.但是由于指针类型不兼容,我无法再传递数组.int (*)[3]对比const int (*)[3].限定符属于指向的数据,而不属于指针本身.

调用者中的显式强制转换将破坏增加类型安全性的整个想法.

如何将const正确性应用于作为参数传递的数组指针?它可能吗?


编辑

就像信息一样,有人说通过像这样的指针传递数组的想法可能源于MISRA C++:2008 5-2-12.例如,请参阅PRQA的高完整性C++标准.

c const-correctness

16
推荐指数
2
解决办法
1358
查看次数

将二维数组传递给常量参数的函数

我从C Primer Plus中了解到,如果你想保护数组不被函数意外修改,你应该const在函数定义的标题中的指针声明之前添加修饰符.

遵循这个明智的建议,在下面的最小例子中,我试图将一个非常数二维数组array传递给函数Sum2D,其中一个参数是a pointer-to-const-int[2].

#include <stdio.h>
#define ROWS 2
#define COLS 2
int Sum2D(const int ar[][COLS], int rows); //use `const` to protect input array
int main(void)
{
    int array[ROWS][COLS]={{1,2},{3,4}}; //the non-constant array

    printf( "%d\n", Sum2D(array,ROWS) );

    return 0;
}

int Sum2D(const int ar[][COLS], int rows)
{
    int total=0;
    int i,j;
    for( i=0 ; i<rows ; i++ )
    {
        for( j=0 ; j<COLS ; j++ )
        {
            total+=ar[i][j];
        }
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers gcc-warning

4
推荐指数
1
解决办法
3122
查看次数

标签 统计

c ×2

arrays ×1

const-correctness ×1

gcc-warning ×1

pointers ×1