我已经创建了一个函数,它应该打印一个数组数组用于测试目的。由于我不想修改函数本身的任何内容,我认为为函数定义设置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在函数内?
答案 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可以改变的东西可能会误导编译器并产生不可预见的结果,特别是如果你是多线程环境。