【问题标题】:Passing a char *[] array into a function that takes parameter const char **将 char *[] 数组传递给带有参数 const char ** 的函数
【发布时间】:2014-10-06 00:43:20
【问题描述】:

所以我有一个库函数,它接受一个 const char ** 作为其参数之一来表示一个 char *s 数组。

void libraryFunc(const char ** parameter);

所以我目前正在做的是这个(全部在 C 顺便说一句):

char *string1 = "myString";
char *string2 = "myString2";
char *stringArray[2] = { string1, string2 };
libraryFunc(&stringArray[0]);

^这会导致编译器错误提示“没有对 libraryFunc 的匹配调用”。我还尝试了以下方法:

libraryFunc(stringArray);
libraryFunc(&stringArray);

似乎无法弄清楚。

【问题讨论】:

  • 我需要什么样的演员表?只是(常量)?
  • 也许你在调用libraryFunc之前忘记了函数原型或包含.h文件。 codepad.org/cpUUPJKR

标签: c arrays pointers parameters char


【解决方案1】:

你可以选择它:

libraryFunc( (const char **) stringArray);

或者,最好只更改数组的声明:

char *string1 = "myString";
char *string2 = "myString2";
const char *stringArray[2] = { string1, string2 };
libraryFunc(stringArray);

您不能将char ** 隐式转换为const char **,因为这仅适用于第一级间接(注意在上面的第二个摘录中,您将char * 隐式转换为const char *,因为它位于第一级间接,很好)。 This question from the comp.lang.c FAQ 更详细地解释了它为什么会这样工作。

【讨论】:

  • 那么应该是 libraryFunc((const char **)stringArray) 还是 libraryFunc((const char **) & stringArray[0]) ?
  • 这应该是我在回答中所写的。您的第二种选择并没有错,只是不必要的、非惯用的和冗长的。在这种情况下,stringArray 会自动隐式转换为指向其第一个元素的指针。而且,顺便说一句,stringArray 是 C 中的保留标识符,您应该将数组命名为其他名称。 string1string2 也是如此。
  • 谢谢。我实际上并没有在我的代码中称它们为“stringArray”和“string1”。为了这个问题,我只是更改了变量的名称。
【解决方案2】:

这是因为你试图通过

char* - a pointer

const char** - pointer to pointer to const char

const 的使用是一个契约,你不能通过两个指针的间接来满足这个契约。之所以如此,是因为否则您总是可以像这样更改这个 const char 应用程序(这是从 C++ 标准中获取的,使用我的 cmets):

const char c = 'c';
char* pc;
const char** pcc = &pc;   // not allowed (thankfully!)
                ^^^ here the bundit is hidden under const: "I will not modify"
*pcc = &c;                // *pcc is "pointer to const" right? so this is allowed...
*pc = 'C';                // would allow to modify a const object, *pc is char right?

有关更多详细信息,您可以关注我关于类似主题的其他答案: https://stackoverflow.com/a/16390371/1141471

在线代码:

http://coliru.stacked-crooked.com/a/74392c59cfc3ef70

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多