将非const值传递给在C中获取const参数的函数的正确方法是什么?

时间:2013-12-05 02:44:12

标签: c arrays function pointers const

我已经创建了一个函数,它应该打印一个数组数组用于测试目的。由于我不想修改函数本身的任何内容,我认为为函数定义设置const值和const指针会很好。

void test_print(const char*** const array);

/*Some code*/


void test_print(const char*** const command_array){
    int j=0;
    while(command_array[j]!=NULL){
        int k=0;
        while(command_array[j][k]!=NULL){
            printf("%s and %d\n",(command_array[j][k]),j);
            ++k;
        }
        ++j;
    }
}

但是,如果我不通过像这样投射我的数组来调用该函数:

test_print((const char*** const)command_array);

然后我收到错误:

invalid conversion from 'char***' to 'const char***'

所以我的问题是:我做的是正确的,还是有其他方式进行转换?是否真的说这个演员只会使数组const在函数内?

2 个答案:

答案 0 :(得分:3)

将command_array强制转换为const char*** const实际上并不安全。

考虑以下代码:

void test_print(const char*** const command_array)
{
    // command_array is a constant pointer to a non-constant pointer to a non-constant pointer to a constant char

    // we can easily change one of the non-constant levels
    **command_array = "Hello";
}

void fail()
{
    char command[6] = "hello";
    char *level1 = command;
    char **level2 = &level1;
    char ***level3 = &level2;

    ***level3 = 'j'; // valid; now command holds "jello"

    test_print((const char*** const)level3);

    ***level3 = 'z'; // segfault!
}

我相信(意思是我没有对此进行测试)const char* const* const* const是安全的,但仍未被隐式转换。

最后const也不是必需的 - const char* const* const*const char* const* const* const相同

答案 1 :(得分:-1)

这里要小心。您的编译器可能会为“const”字段生成略有不同的目标代码。

“const”也是一种告诉优化器值永远不会改变的方法。转换为const可以改变的东西可能会误导编译器并产生不可预见的结果,特别是如果你是多线程环境。