传递给函数的C数组:如何绝对防止它被写入?

时间:2016-02-05 17:42:29

标签: c arrays pointers const

我想防止传递给函数的整数数组被改变:使用const

  • 防止受到影响(=或++:编译错误=确定)

  • 不要阻止扫描! (scanf:仅来自编译器的警告......如何获得编译错误......

有办法吗?

编辑1:可能是我不够清楚...我想证明,当添加const时,不可能修改数组的内容......但似乎它不是不可能...

编辑2:从你的答案中得出结论:使用C,不可能防止传递给函数的整数数组在该函数内被修改(-Wall编译器选项产生错误而不是警告)

我已经阅读过关于const的位置的事情,但它对我没有帮助。

感谢您的帮助。

代码示例:

#include <stdio.h>
#define mySIZE 4

void testReadOnly1(const int t[])
{
    unsigned int i = 0;
    for (i=0; i<mySIZE; i++)
    {
      /*t[i] = 0;*/ /* ERROR : assignment to read-only location */
    }
}
void testReadOnly2(const int t[])
{
    unsigned int i = 0;
    for (i=0; i<mySIZE; i++)
    {
        printf("%d ",i);
        scanf("%d",&t[i]); /* warning : writing into constant object */
    }
}
void testReadOnly3(const int const t[])
{
    unsigned int i = 0;
    for (i=0; i<mySIZE; i++)
    {
        printf("%d ",i);
        scanf("%d",&t[i]); /* warning : writing into constant object */
    }
}
 void show(const int t[])
 {
    unsigned int i = 0;
    printf("\n");
    for (i=0; i<mySIZE; i++)
    {
        printf("%d ",t[i]);
    }
    printf("\n");
 }
int main ( void )
{
    int t[mySIZE];
   /*testReadOnly1(t);
        show(t);*/
    testReadOnly2(t);
        show(t);
    testReadOnly3(t);
        show(t);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

scanf是一个可变函数int scanf(const char *restrict format, ...);,并且缺少有关您传递给它的其他参数的任何类型信息。这些天的C编译器确实有类似printf / scanf行为的知识,并且可以尝试执行一些类型检查,比如将const对象传递给scanf时得到的警告。我没有看到一种方法可以将特定的warning : writing into constant object GCC警告变成错误而不会使-Werror出现任何错误警告,即使修改这样的const对象是技术上未定义的行为。 / p>