为什么我不能向接受const char ** 的函数传入char **?

 编译sv/feature/cluster 下面这行
rc = nsr_cluster_insert2db(key_image);  出错:
test.c|47| error: invalid conversion from ‘char**’ to ‘const char**’

但是在我 的测试程序中,仅仅给出了警告:
  1. #include <stdio.h>
  2. int main() {
  3.     char **_p;
  4.     fun(_p);
  5. }
  6. void fun(const char **p) {
  7.    printf("test/n");
  8. }
  9. ~                                                                       
  10. ~           
                                                               

查了C FAQ,下面这段话暂没看懂:

11.10 为什么我不能向接受const char ** 的函数传入char **?
你可以向接受const-T 的指针的地方传入T 的指针(任何类型T 都适用)。但
是, 这个允许在带修饰的指针类型上轻微不匹配的规则(明显的例外) 却不能递归
应用, 而只能用于最上层。
如果你必须赋值或传递除了在最上层还有修饰符不匹配的指针, 你必须明确
使用类型转换(本例中, 使用(const char **)), 不过, 通常需要使用这样的转换意
味着还有转换所不能修复的深层次问题。
参考资料: [ISO, Sec. 6.1.2.6, Sec. 6.3.16.1, Sec. 6.5.3]; [H&S, Sec. 7.9.1 pp.
221-2]

找到出问题的原因了。   上面的test.c虽然是用gcc编译的,但是其中调用 的nsr_cluster_insert2db(key_image)函数是由g++编译链接的共享库libnsrcluster.so提供,所以nsr_cluster_insert2db 函数以C++的方式处理入参,而C++的类型转换规则更加严格,所以编译test.c时就会出现invalid conversion的错误。

以下是makefile的部分内容:
libnsrcluster.so:$(SRC)
    g++  -shared -o $@ $^ $(LIBPATH) $(LIB) $(INCLUDE)
test:test.c libnsrcluster.so
    gcc -g -o $@ $< $(INCLUDE) $(LIBPATH) $(LIB)  -llpool -lnsrcluster



C语言中`const char* const p3`、`const char* p1`和`char *const p2`这三种指针声明的区别主要体现在指针本身和所指向内容的可修改性上: ### `const char* p1` `const`放在`*`的左边,修饰的是`*p1`,意味着`p1`指向的对象不能通过`p1`来改变,但是`p1`变量中的地址是可以改变的。例如: ```c #include <stdio.h> int main() { char str1[] = "hello"; char str2[] = "world"; const char* p1 = str1; // *p1 = 'H'; // 错误,不能通过p1修改指向的对象 p1 = str2; // 正确,可以修改p1的地址 printf("%s\n", p1); return 0; } ``` 这种指针常用于函数参数,当函数需要修改传入的字符串内容时,可使用`const char*`作为参数类型,以保证数据的安全性。 ### `char *const p2` `const`放在`*`的右边,修饰的是`p2`,表示`p2`的内容(即地址)不能被改变,但是`p2`指向的对象是可以通过`p2`来改变的。例如: ```c #include <stdio.h> int main() { char str[] = "hello"; char *const p2 = str; *p2 = 'H'; // 正确,可以通过p2修改指向的对象 // p2 = NULL; // 错误,不能修改p2的地址 printf("%s\n", p2); return 0; } ``` 这种指针通常用于需要固定指向某个内存区域,且要对该区域内容进行修改的场景。 ### `const char* const p3` `const`在`*`的左右两边都有,意味着`p3`指向的对象不能通过`p3`来改变,同时`p3`变量中的地址也不能改变。例如: ```c #include <stdio.h> int main() { char str[] = "hello"; const char* const p3 = str; // *p3 = 'H'; // 错误,不能通过p3修改指向的对象 // p3 = NULL; // 错误,不能修改p3的地址 printf("%s\n", p3); return 0; } ``` 这种指针用于既希望改变指针地址,也希望通过指针修改指向内容的场景。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值