如何将非常量双指针作为常量参数传递给另一个函数?
我的代码:
#include <iostream>
void food(const char** begin, const char** end) {
}
int main(int argc, char** argv) {
food(argv, argv + argc);
}
我收到的错误:
<source>: In function 'int main(int, char**)':
<source>:8:10: error: invalid conversion from 'char**' to 'const char**' [-fpermissive]
8 | food(argv, argv + argc);
| ^~~~
| |
| char**
<source>:3:24: note: initializing argument 1 of 'void food(const char**, const char**)'
3 | void food(const char** begin, const char** end) {
| ~~~~~~~~~~~~~^~~~~
<source>:8:21: error: invalid conversion from 'char**' to 'const char**' [-fpermissive]
8 | food(argv, argv + argc);
| ~~~~~^~~~~~
| |
| char**
<source>:3:44: note: initializing argument 2 of 'void food(const char**, const char**)'
3 | void food(const char** begin, const char** end) {
|
其他答案解释了您当前的问题。
在这里我想演示一种替代方案(上面的评论中已经提到):
由于您使用的是 C++,请将 argc+argv(实际上是从 C 继承而来的)转换为s
std::vector
的C++std::string
。在 C++ 中使用标准容器和字符串比使用普通 C 数组和 C 字符数组更加符合惯用用法。
现场演示
解决方案 1:make
main
take aconst char**
(注意:当被劫持时可能无法实现main
,就像 SDL 所做的那样)。解决方案 2:创建另一个可以修改的
const char*
内部。main
您的原始代码无法编译,因为在里面
food
我可以设置*begin
为const char*
存储在只读内存中,然后在您的代码main
中将有一个char*
指向的,const char
这是不正确的。创建一个新的
begin
和end
已经存在的const char*
可以避免这个问题,因为对它们的任何更改都不会使之无效argv
。在 C++ 和 C 中,我们可以将 a 赋值
type*
给 aconst type*
。然而这里的情况并非如此 - 问题在于const
函数参数的限定符不属于指向指针的指针,而是属于“指向所指向数据的指针”。严格来说,
argv
它指向读/写内存,尽管对其进行写入是值得怀疑的做法。我们可以通过在调用方添加指针来解决这个问题:
这里
*argv
将一个赋给char*
数据,我们可以将其赋给一个只读的const char*
。然后将一个指针传递给该指针。